Set global variables

From TO/JS - This section sets some flags that can be tweaked to re-run the analysis with different filtering parameters:

RUN_EXAMPLE: allows discarding alleles that have a frequency below a threshold (defaults to FALSE), WITHIN_INDIVIDUAL_ALLELE_FREQ_THR: allows discarding alleles that have a frequency below a threshold (defaults to 0), BENCHMARK_MARKERS: list of markers to include in the analysis (defaults to the full list established by Jason, could be reduced down to 3 for memory optimization), MAX_MOI_TO_INCLUDE: allows discarding participant data when they exhibit very complex infection patterns, counted as the total number of clones across all infection events (defaults to 8), PRIOR_3RS: a named vector with prior probabilities of recrudescence (C), relapse (L) or reinfection (I) (defaults to uniform, i.e. 1/3 each, but tweaked to minimize recrudescence in the present study).

## RUN_EXAMPLE
##   Boolean flag to enable/disable running the example Pv3Rs posterior 
##   computation on a single episode sampled at random from the dataset.
## DEFAULT: FALSE
RUN_EXAMPLE <- TRUE

## WITHIN_INDIVIDUAL_ALLELE_FREQ_THR
##   Minimum threshold above which an allele is preserved in individual
##   haplotype data to be preserved when reconstructing infection 
##   history. Note that this will *not* discard these alleles from the
##   population-level allele frequency that is derived from the initial
##   visit, but only discard that allele from individual observations 
##   when it is 'too rare to be exploited'.
## DEFAULT: 0
WITHIN_INDIVIDUAL_ALLELE_FREQ_THR <- 0

## BENCHMARK_MARKERS
##   Vector of character string with names matching those from the 
##   markers of interest for amplicon sequencing. Only the markers 
##   listed in that vector will be preserved in individual-level data
##   and identity of infection will be solely based on the alleles 
##   observed for these markers.
##   The markers are listed by importance as discovered by Jason.
## DEFAULT: all markers (could be suboptimal/too memory-consuming?)
BENCHMARK_MARKERS <- c(
  "Chr05",
  "Chr07", 
  "Chr09", 
  "Chr10",
  "Chr08",
  "Chr13",
  "Chr11",
  "Chr03",
  "Chr01",
  "Chr02",
  "Chr14"
)

## MAX_MOI_TO_INCLUDE
##   As per Aimee's guidelines: 
##     We do not recommend running compute_posterior() for data 
##     whose total genotype count exceeds eight, where the total 
##     genotype count is the sum of per-episode maximum per-marker 
##     allele counts.
##   The MAX_MOI_TO_INCLUDE expects an integer that will discard all
##   individuals having a summed MOI > 8 across all recorded episodes.
## DEFAULT: 8
MAX_MOI_TO_INCLUDE <- 8

## PRIORS_3RS
##   A vector of probabilities, summing to 1, corresponding to 
##   the probability of each stage for the 3Rs for Pv episodes.
##   The vector order is re(C)rudescence, re(L)apse, re(I)nfection.
##   In this clinical trial, we assume recrudescence is possible so, 
##   we use the default priors 
## DEFAULT: c("C" = 1/3, "L" = 1/3, "I" = 1/3)
# PRIOR_3RS <- c("C" = 1/3, "L" = 1/3, "I" = 1/3)
# Note: the below probabilities were used for SeroTAT study because it does not involve treatment at baseline
# We will use the same for the Peru community survey
PRIOR_3RS <- c("C" = 0.10, "L" = 0.45, "I" = 0.45)

Peru data curation

Read in data from Peru:

peru <- read.csv(here("data/final", "merged_PE.csv"))

# head(peru)
# names(peru)

Number of unique haplotypes (ie marker cardinality):

peru %>% 
  group_by(marker_id) %>% 
  summarise(unique_haplotypes = n_distinct(haplotype))
## # A tibble: 11 × 2
##    marker_id unique_haplotypes
##    <chr>                 <int>
##  1 Chr01                     3
##  2 Chr02                     4
##  3 Chr03                     3
##  4 Chr05                     7
##  5 Chr07                     6
##  6 Chr08                     5
##  7 Chr09                     3
##  8 Chr10                     4
##  9 Chr11                     5
## 10 Chr13                     5
## 11 Chr14                     4

Counts of each haplotype:

peru %>% count(marker_id, haplotype)
##    marker_id haplotype  n
## 1      Chr01   Chr01-1 66
## 2      Chr01   Chr01-2 49
## 3      Chr01   Chr01-3  6
## 4      Chr02   Chr02-1 81
## 5      Chr02   Chr02-2 47
## 6      Chr02   Chr02-3 22
## 7      Chr02   Chr02-4  2
## 8      Chr03   Chr03-1 93
## 9      Chr03   Chr03-2 30
## 10     Chr03   Chr03-3 28
## 11     Chr05   Chr05-1 53
## 12     Chr05   Chr05-2 24
## 13     Chr05   Chr05-3 17
## 14     Chr05   Chr05-4 14
## 15     Chr05   Chr05-5  7
## 16     Chr05   Chr05-6  5
## 17     Chr05   Chr05-8  2
## 18     Chr07   Chr07-1 70
## 19     Chr07   Chr07-2 48
## 20     Chr07   Chr07-3 23
## 21     Chr07   Chr07-4 12
## 22     Chr07   Chr07-5  7
## 23     Chr07   Chr07-6  2
## 24     Chr08   Chr08-1 45
## 25     Chr08   Chr08-2 46
## 26     Chr08   Chr08-3 24
## 27     Chr08   Chr08-4  7
## 28     Chr08   Chr08-6  2
## 29     Chr09   Chr09-1 63
## 30     Chr09   Chr09-2 67
## 31     Chr09   Chr09-3 15
## 32     Chr10   Chr10-1 71
## 33     Chr10   Chr10-2 21
## 34     Chr10   Chr10-3 10
## 35     Chr10   Chr10-4  3
## 36     Chr11   Chr11-1 56
## 37     Chr11   Chr11-2 40
## 38     Chr11   Chr11-3 24
## 39     Chr11   Chr11-4 18
## 40     Chr11   Chr11-5 15
## 41     Chr13   Chr13-1 67
## 42     Chr13   Chr13-2 38
## 43     Chr13   Chr13-3 16
## 44     Chr13   Chr13-4 13
## 45     Chr13   Chr13-5  6
## 46     Chr14   Chr14-1 73
## 47     Chr14   Chr14-2 66
## 48     Chr14   Chr14-3 13
## 49     Chr14   Chr14-4  3

“MOI”:

peru %>% 
  group_by(PatientName, marker_id) %>%
  summarise(n_haplotypes = n(), .groups = 'drop') %>%
  group_by(PatientName) %>% 
  summarise(max_moi = max(n_haplotypes)) 
## # A tibble: 93 × 2
##    PatientName max_moi
##    <chr>         <int>
##  1 M1A007A           2
##  2 M1A007B           3
##  3 M1A007F           2
##  4 M1A008D           3
##  5 M1A020B           3
##  6 M1A020F           2
##  7 M1A033B           2
##  8 M1A037I           2
##  9 M1A040B           2
## 10 M1A043E           4
## # ℹ 83 more rows

Recurrences

Participants with more than one episode for inference (n=40 participants, n=87 Pv isolates):

peru %>% 
  select(PatientName, episodes) %>% 
  distinct() %>% 
  arrange(PatientName) %>% 
  filter(episodes>1) 
##    PatientName episodes
## 1      M1A007B        2
## 2      M1A007F        2
## 3      M1A008D        2
## 4      M1A020B        2
## 5      M1A043E        2
## 6      M1A082B        2
## 7      M1A083D        2
## 8      M1A085C        2
## 9      M1A161C        2
## 10     M1B011B        2
## 11     M1B020F        2
## 12     M1B040B        2
## 13     M1C002A        2
## 14     M1C007E        2
## 15     M1C010B        2
## 16     M1C019D        2
## 17     M1C031G        2
## 18     M1C061B        2
## 19     M1C081A        4
## 20     M1C090C        2
## 21     M1D006D        2
## 22     M1D010A        2
## 23     M1D019A        2
## 24     M1D024B        2
## 25     M1D026A        3
## 26     M1D026D        3
## 27     M1D036A        2
## 28     M1D036C        2
## 29     M1D038D        2
## 30     M1D042A        2
## 31     M1D049A        2
## 32     M1D049D        3
## 33     M1E016A        2
## 34     M1E022A        2
## 35     M1E025B        2
## 36     M1E026C        2
## 37     M1E028C        2
## 38     M1E036B        3
## 39     M1E042B        2
## 40     M1E044C        3
ids_recurrent <- peru %>% clean_names() %>% filter(episodes > 1) %>% distinct(patient_name)
peru_recurrent <- peru %>% clean_names() %>% filter(episodes > 1)

# setdiff(ids_recurrent$patient_name, peru_recurrent$patient_name)
# setdiff(peru_recurrent$patient_name, ids_recurrent$patient_name)

# peru_recurrent %>% distinct(sample_id) %>% arrange(sample_id) # 87 isolates

Data on episode number and time since last episode

episode_summary <- peru_recurrent %>% 
  distinct(patient_name, date, sample_id, day) %>% 
  mutate(date = mdy(date)) %>%
  arrange(patient_name, date) %>% 
  group_by(patient_name) %>% 
  mutate(
    # get the episode number
    episode_number = row_number(),
    # calculate days since enrolment, just a check with dates
    days_since_enrolment = as.integer(date - min(date[day == "Day 0"])),
    # calculate days since last episode using lag() and making enrolment episodes 0 days since last
    days_since_last_episode = replace_na(as.integer(date - lag(date)), 0)
  ) %>% 
  ungroup()

Note that in the Peru study this is not necessarily a person’s “first” episode, rather the first episode in the evaluated study period

episode_summary %>% 
  distinct(patient_name, sample_id, days_since_enrolment) %>%
  ggplot(aes(x = days_since_enrolment, y = reorder(patient_name, days_since_enrolment))) +
    geom_line(aes(group = patient_name), color = "darkgrey") +
    geom_point() +
    labs(x = "Days since first episode during study period",
         y = "Participant") +
    theme_bw() 

Haplotype frequencies

We want to remove any haplotypes that appear only once at very low frequencies. Haplotypes should already be filtered to be observed in at least 2 samples and within-host frequency >=1% (in full dataset).

singleton_haps <- peru_recurrent %>% 
  select(sample_id, marker_id, haplotype, frequency, count) %>% 
  count(haplotype) %>% 
  arrange(n) %>% 
  filter(n==1) %>% 
  pull(haplotype)

peru_recurrent %>% 
  filter(haplotype %in% singleton_haps) %>% 
  ggplot(aes(x = haplotype, y = count)) +
    geom_hline(yintercept = 100, linetype = "dashed") +
    geom_point(aes(color = frequency, shape = day), size = 3) +
    labs(x = "singleton haplotype",
         y = "read count",
         color = "within-sample frequency",
         shape = "timepoint") +
    theme_bw() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

peru %>% 
  filter(haplotype %in% singleton_haps) %>% 
  ggplot(aes(x = haplotype, y = count)) +
    geom_hline(yintercept = 100, linetype = "dashed") +
    geom_point(aes(color = frequency, shape = day), size = 3) +
    labs(x = "singleton haplotype",
         y = "read count",
         color = "within-sample frequency",
         shape = "timepoint") +
    theme_bw() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

## Haplotypes for inference For Peru, most recurrences would be expected to be either reinfections or relapses, given that this study was an observational community cohort in two sites in Peru. As per Aimee’s suggestion, we can estimate population-level allele frequencies based on all episodes in our dataset (we will use the entire dataset (n=93 participants), not just those the subset that experienced recurrences (n=40). This should be unbiased as both reinfections and relapses are draws from the mosquito population (relapses would be time-lagged draws) in the absence of any systematic within-patient selection of recrudescent parasites.

# n=1530 haps
all_haps <- peru %>% 
  pull(haplotype)

peru %>%
  select(sample_id, marker_id, haplotype, frequency, count) %>%
  arrange(frequency, count)
##      sample_id marker_id haplotype frequency count
## 1     AL029017     Chr07   Chr07-1   0.01010    88
## 2     AL025031     Chr11   Chr11-3   0.01015    44
## 3     AC035261     Chr01   Chr01-2   0.01031    22
## 4     AL026178     Chr03   Chr03-1   0.01031    22
## 5     AL029975     Chr02   Chr02-3   0.01031    22
## 6     AC033642     Chr14   Chr14-1   0.01031    44
## 7     AL025336     Chr13   Chr13-2   0.01042    44
## 8     AL033228     Chr03   Chr03-3   0.01045    66
## 9     AC029508     Chr02   Chr02-3   0.01053    44
## 10    AC031719     Chr02   Chr02-1   0.01056    66
## 11    AL032119     Chr03   Chr03-1   0.01064    44
## 12    AL033217     Chr01   Chr01-2   0.01064    44
## 13    AC025519     Chr14   Chr14-1   0.01071    66
## 14    AL033398     Chr08   Chr08-2   0.01075    44
## 15    AC035261     Chr02   Chr02-1   0.01095    66
## 16    AC025519     Chr02   Chr02-1   0.01099    44
## 17    AC028231     Chr07   Chr07-1   0.01102    88
## 18    AL032119     Chr05   Chr05-1   0.01111    44
## 19    AL026659     Chr05   Chr05-5   0.01115    66
## 20    AL030767     Chr03   Chr03-1   0.01119    66
## 21    AC025640     Chr14   Chr14-1   0.01124    44
## 22    AL032765     Chr14   Chr14-3   0.01124    44
## 23    AL030953     Chr01   Chr01-2   0.01136    22
## 24    AL026659     Chr11   Chr11-2   0.01136    44
## 25    AL025230     Chr02   Chr02-2   0.01149    22
## 26    AC032493     Chr07   Chr07-5   0.01149    44
## 27    AL025332     Chr03   Chr03-1   0.01153    88
## 28    AL025332     Chr10   Chr10-3   0.01161   114
## 29    AL026468     Chr08   Chr08-1   0.01170    44
## 30    AC033409     Chr03   Chr03-3   0.01180    88
## 31    AC031997     Chr05   Chr05-4   0.01190    66
## 32    AL030581     Chr03   Chr03-2   0.01195    66
## 33    AC032820     Chr07   Chr07-1   0.01205    66
## 34    AL026649     Chr14   Chr14-1   0.01208    88
## 35    AL024635     Chr03   Chr03-3   0.01217   110
## 36    AC034050     Chr11   Chr11-1   0.01223    88
## 37    AC032947     Chr09   Chr09-1   0.01235    22
## 38    AL031919     Chr09   Chr09-1   0.01242    88
## 39    AC028730     Chr09   Chr09-1   0.01249    33
## 40    AC034050     Chr14   Chr14-2   0.01255    66
## 41    AC035178     Chr10   Chr10-1   0.01261    66
## 42    AL029071     Chr08   Chr08-1   0.01266    22
## 43    AL031919     Chr10   Chr10-1   0.01266    44
## 44    AL032744     Chr14   Chr14-4   0.01266    44
## 45    AC033642     Chr07   Chr07-1   0.01274    88
## 46    AC034279     Chr07   Chr07-2   0.01294    88
## 47    AL025336     Chr01   Chr01-2   0.01316    22
## 48    AL027673     Chr14   Chr14-1   0.01316    66
## 49    AC029508     Chr14   Chr14-2   0.01329   132
## 50    AC025519     Chr13   Chr13-1   0.01339    66
## 51    AL025114     Chr10   Chr10-3   0.01351    88
## 52    AL026649     Chr07   Chr07-5   0.01355   110
## 53    AL029026     Chr10   Chr10-2   0.01383   138
## 54    AL025728     Chr14   Chr14-1   0.01418    44
## 55    AC034470     Chr11   Chr11-5   0.01418    88
## 56    AL028427     Chr11   Chr11-1   0.01449    66
## 57    AL024087     Chr01   Chr01-1   0.01500    66
## 58    AL033098     Chr08   Chr08-1   0.01515    22
## 59    AL033098     Chr08   Chr08-4   0.01515    22
## 60    AC030871     Chr14   Chr14-1   0.01556    88
## 61    AL026738     Chr01   Chr01-2   0.01562    22
## 62    AL029026     Chr14   Chr14-1   0.01565   155
## 63    AL032236     Chr08   Chr08-3   0.01587    22
## 64    AL026659     Chr07   Chr07-2   0.01609   132
## 65    AL031382     Chr09   Chr09-1   0.01636   101
## 66    AC034279     Chr09   Chr09-2   0.01653    44
## 67    AL025075     Chr09   Chr09-3   0.01653    44
## 68    AL033217     Chr11   Chr11-2   0.01660    88
## 69    AC035959     Chr11   Chr11-2   0.01662   132
## 70    AC034529     Chr07   Chr07-4   0.01667   110
## 71    AL030528     Chr02   Chr02-1   0.01676    66
## 72    AL025728     Chr02   Chr02-1   0.01724   132
## 73    AC035261     Chr11   Chr11-2   0.01748   110
## 74    AL025336     Chr03   Chr03-1   0.01780   176
## 75    AL029026     Chr03   Chr03-2   0.01814   176
## 76    AC032492     Chr14   Chr14-3   0.01863    66
## 77    AL029071     Chr11   Chr11-3   0.01899    66
## 78    AL026609     Chr02   Chr02-1   0.01923    22
## 79    AL030528     Chr05   Chr05-2   0.01923    22
## 80    AL031382     Chr01   Chr01-3   0.01923    22
## 81    AL031062     Chr02   Chr02-2   0.01932    88
## 82    AL025765     Chr07   Chr07-5   0.02000   132
## 83    AC035959     Chr01   Chr01-2   0.02143    66
## 84    AL025728     Chr05   Chr05-4   0.02183   110
## 85    AL031366     Chr14   Chr14-2   0.02500   132
## 86    AL031062     Chr05   Chr05-5   0.02647   198
## 87    AL023661     Chr08   Chr08-2   0.02662   154
## 88    AL029026     Chr03   Chr03-1   0.02721   264
## 89    AC025795     Chr02   Chr02-1   0.02797    88
## 90    AC025519     Chr05   Chr05-1   0.02817    44
## 91    AC034050     Chr07   Chr07-1   0.02885   132
## 92    AL026178     Chr07   Chr07-4   0.02907   110
## 93    AL029026     Chr07   Chr07-2   0.02923   287
## 94    AL029026     Chr07   Chr07-1   0.02933   288
## 95    AL032236     Chr01   Chr01-3   0.03057   154
## 96    AC032820     Chr02   Chr02-3   0.03185   220
## 97    AL025336     Chr09   Chr09-2   0.03212    81
## 98    AL032744     Chr02   Chr02-2   0.03265   176
## 99    AL029026     Chr02   Chr02-1   0.03268   110
## 100   AL030634     Chr01   Chr01-2   0.03279    44
## 101   AL031062     Chr11   Chr11-4   0.03358   198
## 102   AL025765     Chr03   Chr03-3   0.03371   336
## 103   AL032236     Chr14   Chr14-2   0.03448    44
## 104   AL026178     Chr11   Chr11-1   0.03529    66
## 105   AC032947     Chr08   Chr08-2   0.03727   132
## 106   AL023661     Chr09   Chr09-1   0.03836   330
## 107   AC032502     Chr11   Chr11-5   0.04167    66
## 108   AL033070     Chr09   Chr09-1   0.04245   198
## 109   AL032437     Chr11   Chr11-1   0.04274   110
## 110   AL023661     Chr14   Chr14-2   0.04453   242
## 111   AL033070     Chr14   Chr14-2   0.04624   176
## 112   AC034050     Chr13   Chr13-2   0.04702   330
## 113   AC031312     Chr09   Chr09-2   0.04930   154
## 114   AL032500     Chr11   Chr11-1   0.05303   154
## 115   AL030953     Chr13   Chr13-4   0.05556   132
## 116   AL032912     Chr01   Chr01-3   0.05618   110
## 117   AL031919     Chr14   Chr14-3   0.05882   330
## 118   AL023661     Chr11   Chr11-5   0.06061   264
## 119   AC034470     Chr10   Chr10-3   0.06122   330
## 120   AL031919     Chr11   Chr11-1   0.06247   603
## 121   AL025031     Chr14   Chr14-4   0.06299   623
## 122   AL031919     Chr03   Chr03-1   0.06312   623
## 123   AL026178     Chr07   Chr07-2   0.06395   242
## 124   AL030953     Chr03   Chr03-1   0.06498   396
## 125   AL029026     Chr09   Chr09-2   0.06533    91
## 126   AC033409     Chr13   Chr13-5   0.06667    22
## 127   AL031448     Chr05   Chr05-1   0.06785   506
## 128   AC030871     Chr02   Chr02-2   0.07322   695
## 129   AL029071     Chr11   Chr11-2   0.07595   264
## 130   AC034470     Chr05   Chr05-1   0.07670   572
## 131   AL032912     Chr01   Chr01-2   0.07865   154
## 132   AL030953     Chr14   Chr14-1   0.08235   308
## 133   AC030871     Chr08   Chr08-6   0.08312   704
## 134   AL023661     Chr02   Chr02-2   0.08322   816
## 135   AL023661     Chr13   Chr13-4   0.08383   308
## 136   AL033070     Chr07   Chr07-1   0.08488   834
## 137   AL031919     Chr13   Chr13-4   0.08696    44
## 138   AL033070     Chr13   Chr13-2   0.09184   198
## 139   AL030953     Chr11   Chr11-2   0.09884   374
## 140   AL023661     Chr07   Chr07-3   0.10122   989
## 141   AL031862     Chr11   Chr11-2   0.10160   418
## 142   AL031919     Chr07   Chr07-2   0.10238  1011
## 143   AL023661     Chr03   Chr03-3   0.11326   902
## 144   AL032437     Chr08   Chr08-2   0.12409   374
## 145   AL032119     Chr14   Chr14-4   0.12676   396
## 146   AL030116     Chr03   Chr03-3   0.12727   924
## 147   AC032820     Chr09   Chr09-1   0.12805   462
## 148   AL031062     Chr03   Chr03-3   0.13220   858
## 149   AL030931     Chr02   Chr02-2   0.13309   814
## 150   AL023661     Chr07   Chr07-2   0.13387  1308
## 151   AL031062     Chr03   Chr03-2   0.13559   880
## 152   AL029071     Chr10   Chr10-1   0.15099  1464
## 153   AC029508     Chr05   Chr05-2   0.15550  1276
## 154   AL030116     Chr07   Chr07-4   0.15672  1386
## 155   AC030871     Chr11   Chr11-1   0.16000   352
## 156   AL030114     Chr05   Chr05-1   0.16107   528
## 157   AC034279     Chr13   Chr13-1   0.16190   374
## 158   AL023661     Chr01   Chr01-1   0.16310  1342
## 159   AL032437     Chr02   Chr02-1   0.16312  1012
## 160   AL028375     Chr13   Chr13-2   0.16583   726
## 161   AL031919     Chr08   Chr08-1   0.16722  1100
## 162   AL031919     Chr02   Chr02-1   0.17042  1166
## 163   AC030871     Chr13   Chr13-2   0.17203  1593
## 164   AL031919     Chr13   Chr13-5   0.17391    88
## 165   AL023523     Chr03   Chr03-2   0.17469  1702
## 166   AL031062     Chr07   Chr07-1   0.18147  1780
## 167   AL030931     Chr07   Chr07-3   0.18279  1795
## 168   AL030116     Chr08   Chr08-3   0.18667   308
## 169   AC029508     Chr10   Chr10-2   0.18919  1232
## 170   AL030581     Chr07   Chr07-1   0.18997  1879
## 171   AL026486     Chr14   Chr14-2   0.19417  1826
## 172   AL025332     Chr14   Chr14-1   0.19551   122
## 173   AL029958     Chr11   Chr11-5   0.20635   572
## 174   AL028375     Chr02   Chr02-4   0.20930   396
## 175   AL031919     Chr07   Chr07-3   0.21408  2114
## 176   AL030116     Chr11   Chr11-4   0.22353   418
## 177   AL029958     Chr01   Chr01-1   0.23622   660
## 178   AL032765     Chr08   Chr08-2   0.24405   902
## 179   AL033070     Chr08   Chr08-1   0.24444   968
## 180   AL030116     Chr09   Chr09-3   0.26486  1078
## 181   AL033098     Chr01   Chr01-1   0.27049   726
## 182   AL032765     Chr01   Chr01-1   0.27778   440
## 183   AL032765     Chr14   Chr14-2   0.29213  1144
## 184   AL029958     Chr14   Chr14-2   0.29831  1936
## 185   AC035959     Chr13   Chr13-3   0.30137  1452
## 186   AL029958     Chr07   Chr07-1   0.30215  2887
## 187   AL033098     Chr09   Chr09-1   0.30736  1562
## 188   AL023661     Chr13   Chr13-2   0.31737  1166
## 189   AL028928     Chr02   Chr02-2   0.31955  1870
## 190   AL029958     Chr08   Chr08-4   0.33108  1078
## 191   AL023661     Chr05   Chr05-4   0.34169  2398
## 192   AC033409     Chr08   Chr08-2   0.35926  2134
## 193   AL030931     Chr03   Chr03-3   0.36220  3455
## 194   AL032437     Chr13   Chr13-4   0.36667   726
## 195   AC031719     Chr09   Chr09-1   0.37143  1430
## 196   AL030116     Chr10   Chr10-2   0.37367  3588
## 197   AL031862     Chr14   Chr14-2   0.39837  1078
## 198   AL032437     Chr03   Chr03-3   0.42735  2200
## 199   AC030871     Chr10   Chr10-2   0.46269  2728
## 200   AL032765     Chr07   Chr07-2   0.46397  4533
## 201   AL026486     Chr13   Chr13-2   0.47929  1782
## 202   AC034279     Chr08   Chr08-1   0.50000  4026
## 203   AC034279     Chr08   Chr08-2   0.50000  4026
## 204   AL026486     Chr13   Chr13-1   0.52071  1936
## 205   AL032765     Chr07   Chr07-1   0.53603  5237
## 206   AC030871     Chr10   Chr10-1   0.53731  3168
## 207   AL032437     Chr03   Chr03-1   0.57265  2948
## 208   AL026178     Chr13   Chr13-3   0.58447  2816
## 209   AL031862     Chr14   Chr14-1   0.58537  1584
## 210   AL023661     Chr13   Chr13-1   0.59880  2200
## 211   AL030116     Chr10   Chr10-1   0.62633  6014
## 212   AL032437     Chr13   Chr13-1   0.63333  1254
## 213   AL030931     Chr03   Chr03-2   0.63780  6084
## 214   AC033409     Chr08   Chr08-1   0.64074  3806
## 215   AL023661     Chr05   Chr05-1   0.65831  4620
## 216   AL029958     Chr08   Chr08-2   0.66892  2178
## 217   AL028928     Chr02   Chr02-1   0.68045  3982
## 218   AL031919     Chr07   Chr07-1   0.68354  6750
## 219   AL033098     Chr09   Chr09-2   0.69264  3520
## 220   AL032765     Chr14   Chr14-1   0.69663  2728
## 221   AL029958     Chr07   Chr07-2   0.69785  6668
## 222   AC035959     Chr13   Chr13-1   0.69863  3366
## 223   AL029958     Chr14   Chr14-1   0.70169  4554
## 224   AL032765     Chr01   Chr01-2   0.72222  1144
## 225   AL033098     Chr01   Chr01-2   0.72951  1958
## 226   AL030116     Chr09   Chr09-2   0.72973  2970
## 227   AL031062     Chr03   Chr03-1   0.73220  4752
## 228   AC033409     Chr13   Chr13-1   0.73333   242
## 229   AL031919     Chr13   Chr13-3   0.73913   374
## 230   AL032437     Chr08   Chr08-1   0.74453  2244
## 231   AL033070     Chr08   Chr08-2   0.75556  2992
## 232   AL032765     Chr08   Chr08-4   0.75595  2794
## 233   AL029958     Chr01   Chr01-2   0.76378  2134
## 234   AL023661     Chr07   Chr07-1   0.76492  7474
## 235   AL030116     Chr11   Chr11-5   0.77647  1452
## 236   AL028375     Chr02   Chr02-3   0.77907  1474
## 237   AL033029     Chr13   Chr13-1   0.79032  2156
## 238   AL029958     Chr11   Chr11-2   0.79365  2200
## 239   AL025332     Chr14   Chr14-2   0.80449   502
## 240   AL026486     Chr14   Chr14-1   0.80583  7578
## 241   AL030581     Chr07   Chr07-2   0.81003  8012
## 242   AC029508     Chr10   Chr10-1   0.81081  5280
## 243   AL031062     Chr07   Chr07-2   0.81323  7977
## 244   AL030116     Chr08   Chr08-4   0.81333  1342
## 245   AL030931     Chr07   Chr07-1   0.81721  8025
## 246   AL023523     Chr03   Chr03-3   0.82531  8041
## 247   AL031919     Chr08   Chr08-6   0.82609  5434
## 248   AC030871     Chr13   Chr13-3   0.82797  7667
## 249   AL031919     Chr02   Chr02-2   0.82958  5676
## 250   AL028375     Chr13   Chr13-3   0.83417  3652
## 251   AL032437     Chr02   Chr02-2   0.83688  5192
## 252   AL023661     Chr01   Chr01-2   0.83690  6886
## 253   AC034279     Chr13   Chr13-5   0.83810  1936
## 254   AL030114     Chr05   Chr05-3   0.83893  2750
## 255   AC030871     Chr11   Chr11-2   0.84000  1848
## 256   AL030116     Chr07   Chr07-1   0.84328  7458
## 257   AC029508     Chr05   Chr05-1   0.84450  6930
## 258   AL029071     Chr10   Chr10-2   0.84901  8232
## 259   AL032912     Chr01   Chr01-1   0.86517  1694
## 260   AC032820     Chr09   Chr09-2   0.86585  3124
## 261   AL030931     Chr02   Chr02-1   0.86691  5302
## 262   AL030116     Chr03   Chr03-1   0.87273  6336
## 263   AL032119     Chr14   Chr14-2   0.87324  2728
## 264   AL029071     Chr08   Chr08-3   0.87342  1518
## 265   AL023661     Chr03   Chr03-1   0.88674  7062
## 266   AL026178     Chr07   Chr07-1   0.89535  3388
## 267   AL031862     Chr11   Chr11-4   0.89840  3696
## 268   AL030953     Chr11   Chr11-4   0.90116  3410
## 269   AL029071     Chr11   Chr11-1   0.90506  3146
## 270   AL033070     Chr13   Chr13-1   0.90816  1958
## 271   AL033070     Chr07   Chr07-2   0.91512  8992
## 272   AL023661     Chr02   Chr02-1   0.91678  8989
## 273   AC030871     Chr08   Chr08-4   0.91688  7766
## 274   AL030953     Chr14   Chr14-2   0.91765  3432
## 275   AC034470     Chr05   Chr05-4   0.92330  6886
## 276   AC030871     Chr02   Chr02-3   0.92678  8797
## 277   AL025031     Chr14   Chr14-2   0.92943  9193
## 278   AL031448     Chr05   Chr05-6   0.93215  6952
## 279   AL029026     Chr09   Chr09-1   0.93467  1302
## 280   AL030953     Chr03   Chr03-3   0.93502  5698
## 281   AL031919     Chr03   Chr03-3   0.93688  9247
## 282   AL031919     Chr11   Chr11-4   0.93753  9049
## 283   AC034470     Chr10   Chr10-2   0.93878  5060
## 284   AL032500     Chr11   Chr11-4   0.93939  2728
## 285   AL023661     Chr11   Chr11-1   0.93939  4092
## 286   AL031919     Chr14   Chr14-1   0.94118  5280
## 287   AL029026     Chr07   Chr07-3   0.94143  9243
## 288   AL030953     Chr13   Chr13-1   0.94444  2244
## 289   AC031312     Chr09   Chr09-1   0.95070  2970
## 290   AC034050     Chr13   Chr13-1   0.95298  6688
## 291   AL033070     Chr14   Chr14-1   0.95376  3630
## 292   AL029026     Chr03   Chr03-3   0.95465  9262
## 293   AL023661     Chr14   Chr14-1   0.95547  5192
## 294   AL032437     Chr11   Chr11-2   0.95726  2464
## 295   AL033070     Chr09   Chr09-2   0.95755  4466
## 296   AC032502     Chr11   Chr11-2   0.95833  1518
## 297   AL031062     Chr11   Chr11-2   0.95896  5654
## 298   AL023661     Chr09   Chr09-2   0.96164  8272
## 299   AC032947     Chr08   Chr08-3   0.96273  3410
## 300   AL026178     Chr11   Chr11-3   0.96471  1804
## 301   AL030953     Chr09   Chr09-2   0.96552   616
## 302   AL032236     Chr14   Chr14-1   0.96552  1232
## 303   AL025765     Chr03   Chr03-1   0.96629  9630
## 304   AL030634     Chr01   Chr01-1   0.96721  1298
## 305   AL029026     Chr02   Chr02-2   0.96732  3256
## 306   AL032744     Chr02   Chr02-3   0.96735  5214
## 307   AL025336     Chr09   Chr09-1   0.96788  2441
## 308   AC032820     Chr02   Chr02-1   0.96815  6688
## 309   AL032236     Chr01   Chr01-2   0.96943  4884
## 310   AL033098     Chr08   Chr08-2   0.96970  1408
## 311   AC034050     Chr07   Chr07-2   0.97115  4444
## 312   AC025795     Chr02   Chr02-2   0.97203  3058
## 313   AL023661     Chr08   Chr08-1   0.97338  5632
## 314   AL031062     Chr05   Chr05-1   0.97353  7282
## 315   AC034279     Chr07   Chr07-1   0.97411  6622
## 316   AL032744     Chr14   Chr14-2   0.97468  3388
## 317   AL031366     Chr14   Chr14-1   0.97500  5148
## 318   AL030671     Chr07   Chr07-6   0.97664  9700
## 319   AL030065     Chr07   Chr07-1   0.97690  9769
## 320   AL025728     Chr05   Chr05-2   0.97817  4928
## 321   AC035959     Chr01   Chr01-1   0.97857  3014
## 322   AC032497     Chr02   Chr02-1   0.97887  3058
## 323   AL025765     Chr07   Chr07-4   0.98000  6468
## 324   AL031062     Chr02   Chr02-1   0.98068  4466
## 325   AL026609     Chr02   Chr02-2   0.98077  1122
## 326   AL030528     Chr05   Chr05-4   0.98077  1122
## 327   AL031382     Chr01   Chr01-2   0.98077  1122
## 328   AC032492     Chr14   Chr14-1   0.98137  3476
## 329   AL025336     Chr03   Chr03-2   0.98220  9710
## 330   AC035261     Chr11   Chr11-4   0.98252  6182
## 331   AC033409     Chr07   Chr07-1   0.98261  2486
## 332   AL025728     Chr02   Chr02-2   0.98276  7524
## 333   AC035178     Chr09   Chr09-2   0.98291  5060
## 334   AL030528     Chr02   Chr02-2   0.98324  3872
## 335   AL032119     Chr05   Chr05-6   0.98333  3894
## 336   AC034529     Chr07   Chr07-2   0.98333  6490
## 337   AC035959     Chr11   Chr11-4   0.98338  7810
## 338   AL033217     Chr11   Chr11-3   0.98340  5214
## 339   AC034279     Chr09   Chr09-1   0.98347  2618
## 340   AL025075     Chr09   Chr09-1   0.98347  2618
## 341   AC028231     Chr07   Chr07-3   0.98347  7854
## 342   AL031382     Chr09   Chr09-2   0.98364  6072
## 343   AL030552     Chr07   Chr07-1   0.98366  9693
## 344   AL026659     Chr07   Chr07-1   0.98391  8074
## 345   AL032119     Chr03   Chr03-3   0.98404  4070
## 346   AL030671     Chr08   Chr08-2   0.98413  1364
## 347   AL032236     Chr08   Chr08-2   0.98413  1364
## 348   AL029026     Chr14   Chr14-2   0.98435  9747
## 349   AL026738     Chr01   Chr01-1   0.98438  1386
## 350   AC030871     Chr14   Chr14-2   0.98444  5566
## 351   AL032118     Chr01   Chr01-1   0.98485  1430
## 352   AL024087     Chr01   Chr01-2   0.98500  4334
## 353   AL028427     Chr11   Chr11-3   0.98551  4488
## 354   AL025728     Chr14   Chr14-2   0.98582  3058
## 355   AC034470     Chr11   Chr11-1   0.98582  6116
## 356   AL029017     Chr09   Chr09-2   0.98600  3098
## 357   AL029026     Chr10   Chr10-1   0.98617  9843
## 358   AL026649     Chr07   Chr07-2   0.98645  8008
## 359   AL025114     Chr10   Chr10-4   0.98649  6424
## 360   AC025519     Chr13   Chr13-2   0.98661  4862
## 361   AC029508     Chr14   Chr14-1   0.98671  9802
## 362   AC032493     Chr08   Chr08-2   0.98673  4906
## 363   AL025336     Chr01   Chr01-1   0.98684  1650
## 364   AL027673     Chr14   Chr14-2   0.98684  4950
## 365   AC035959     Chr07   Chr07-3   0.98716  9765
## 366   AL025515     Chr08   Chr08-1   0.98718  1694
## 367   AL026647     Chr11   Chr11-1   0.98718  1694
## 368   AC033642     Chr07   Chr07-3   0.98726  6820
## 369   AL030022     Chr11   Chr11-3   0.98734  1716
## 370   AL031919     Chr10   Chr10-3   0.98734  3432
## 371   AC035178     Chr10   Chr10-2   0.98739  5170
## 372   AC034050     Chr14   Chr14-1   0.98745  5192
## 373   AC028730     Chr09   Chr09-2   0.98751  2610
## 374   AL031919     Chr09   Chr09-2   0.98758  6996
## 375   AC032947     Chr09   Chr09-2   0.98765  1760
## 376   AC034050     Chr11   Chr11-2   0.98777  7106
## 377   AL024635     Chr03   Chr03-2   0.98783  8932
## 378   AL026649     Chr14   Chr14-2   0.98792  7194
## 379   AC032820     Chr07   Chr07-3   0.98795  5412
## 380   AL030581     Chr03   Chr03-1   0.98805  5456
## 381   AC031997     Chr05   Chr05-1   0.98810  5478
## 382   AC033409     Chr03   Chr03-1   0.98820  7370
## 383   AL026468     Chr08   Chr08-3   0.98830  3718
## 384   AL025332     Chr10   Chr10-4   0.98839  9703
## 385   AL032340     Chr09   Chr09-2   0.98844  3762
## 386   AL025332     Chr03   Chr03-2   0.98847  7546
## 387   AL025230     Chr02   Chr02-1   0.98851  1892
## 388   AC032493     Chr07   Chr07-2   0.98851  3784
## 389   AL030953     Chr01   Chr01-1   0.98864  1914
## 390   AL026659     Chr11   Chr11-3   0.98864  3828
## 391   AC025640     Chr14   Chr14-2   0.98876  3872
## 392   AL030767     Chr03   Chr03-2   0.98881  5830
## 393   AL026659     Chr05   Chr05-2   0.98885  5852
## 394   AC025519     Chr02   Chr02-2   0.98901  3960
## 395   AC035261     Chr02   Chr02-3   0.98905  5962
## 396   AL025736     Chr11   Chr11-5   0.98907  7964
## 397   AL033398     Chr08   Chr08-1   0.98925  4048
## 398   AC031997     Chr03   Chr03-1   0.98925  8096
## 399   AC025519     Chr14   Chr14-3   0.98929  6094
## 400   AL033217     Chr01   Chr01-1   0.98936  4092
## 401   AL025031     Chr09   Chr09-1   0.98941  1215
## 402   AC031719     Chr02   Chr02-3   0.98944  6182
## 403   AC029508     Chr02   Chr02-1   0.98947  4136
## 404   AL033228     Chr03   Chr03-1   0.98955  6248
## 405   AL025336     Chr13   Chr13-1   0.98958  4180
## 406   AL033098     Chr05   Chr05-3   0.98964  4202
## 407   AC035261     Chr01   Chr01-1   0.98969  2112
## 408   AL026178     Chr03   Chr03-3   0.98969  2112
## 409   AL029975     Chr02   Chr02-1   0.98969  2112
## 410   AC033642     Chr14   Chr14-3   0.98969  4224
## 411   AL032715     Chr09   Chr09-3   0.98980  4268
## 412   AL025031     Chr11   Chr11-1   0.98985  4290
## 413   AL026649     Chr05   Chr05-2   0.98985  4290
## 414   AL029017     Chr07   Chr07-2   0.98990  8624
## 415   AL030065     Chr14   Chr14-1   0.99003  9832
## 416   AL028365     Chr07   Chr07-1   0.99010  6600
## 417   AL031919     Chr01   Chr01-1   0.99020  8888
## 418   AC032493     Chr01   Chr01-2   0.99038  2266
## 419   AL032066     Chr10   Chr10-1   0.99038  2266
## 420   AL025336     Chr11   Chr11-1   0.99048  4576
## 421   AC032497     Chr05   Chr05-1   0.99052  4598
## 422   AC025795     Chr01   Chr01-2   0.99057  2310
## 423   AL030073     Chr13   Chr13-2   0.99057  2310
## 424   AL026145     Chr14   Chr14-2   0.99065  6996
## 425   AL030065     Chr09   Chr09-2   0.99069  2128
## 426   AL032119     Chr11   Chr11-3   0.99074  2354
## 427   AL024180     Chr11   Chr11-3   0.99074  4708
## 428   AL025031     Chr07   Chr07-1   0.99080  9482
## 429   AL028427     Chr02   Chr02-2   0.99085  7150
## 430   AL025230     Chr07   Chr07-1   0.99091  7194
## 431   AL027682     Chr10   Chr10-1   0.99091  9592
## 432   AC031997     Chr09   Chr09-2   0.99095  4818
## 433   AL024656     Chr07   Chr07-1   0.99097  9658
## 434   AL026486     Chr07   Chr07-1   0.99102  9715
## 435   AL027673     Chr13   Chr13-2   0.99103  4862
## 436   AL025114     Chr07   Chr07-4   0.99104  9841
## 437   AC025540     Chr14   Chr14-2   0.99115  4928
## 438   AL025075     Chr14   Chr14-3   0.99119  4950
## 439   AC031997     Chr02   Chr02-1   0.99123  4972
## 440   AC031312     Chr03   Chr03-1   0.99123  7458
## 441   AL031448     Chr02   Chr02-3   0.99130  5016
## 442   AL026659     Chr02   Chr02-2   0.99138  2530
## 443   AC034050     Chr05   Chr05-1   0.99160  5192
## 444   AL030931     Chr14   Chr14-1   0.99170  5258
## 445   AC034470     Chr14   Chr14-1   0.99174  5280
## 446   AL031382     Chr05   Chr05-3   0.99180  5324
## 447   AL029071     Chr03   Chr03-2   0.99183  8008
## 448   AL032437     Chr07   Chr07-3   0.99189  9660
## 449   AC032492     Chr08   Chr08-2   0.99194  2706
## 450   AL032437     Chr09   Chr09-2   0.99194  2706
## 451   AC027188     Chr07   Chr07-2   0.99194  5412
## 452   AC035333     Chr02   Chr02-2   0.99200  2728
## 453   AL026145     Chr09   Chr09-1   0.99201  6081
## 454   AC035333     Chr05   Chr05-2   0.99203  5478
## 455   AL025031     Chr13   Chr13-2   0.99206  2750
## 456   AL024635     Chr02   Chr02-2   0.99209  5522
## 457   AL030230     Chr09   Chr09-2   0.99219  1652
## 458   AC025540     Chr09   Chr09-1   0.99219  5588
## 459   AL025336     Chr05   Chr05-4   0.99228  5654
## 460   AC025540     Chr11   Chr11-4   0.99234  5698
## 461   AL032437     Chr14   Chr14-1   0.99237  2860
## 462   AL031448     Chr07   Chr07-4   0.99238  9762
## 463   AL028964     Chr05   Chr05-1   0.99245  5786
## 464   AL025515     Chr03   Chr03-1   0.99249  9773
## 465   AL024531     Chr01   Chr01-1   0.99251  5830
## 466   AC027188     Chr09   Chr09-2   0.99254  2926
## 467   AL028375     Chr08   Chr08-2   0.99254  2926
## 468   AL032411     Chr07   Chr07-1   0.99254  9845
## 469   AC033016     Chr03   Chr03-1   0.99257  8822
## 470   AL031366     Chr08   Chr08-1   0.99265  2970
## 471   AL026659     Chr14   Chr14-2   0.99265  8910
## 472   AL032500     Chr05   Chr05-5   0.99270  2992
## 473   AC028231     Chr09   Chr09-1   0.99271  5444
## 474   AL032912     Chr02   Chr02-2   0.99278  6050
## 475   AL026647     Chr05   Chr05-2   0.99288  6138
## 476   AL026640     Chr01   Chr01-1   0.99301  3124
## 477   AL025728     Chr13   Chr13-2   0.99306  3146
## 478   AL027682     Chr09   Chr09-1   0.99309  1294
## 479   AL030634     Chr08   Chr08-1   0.99310  3168
## 480   AL024087     Chr05   Chr05-1   0.99313  9542
## 481   AL024180     Chr05   Chr05-2   0.99315  3190
## 482   AL028375     Chr11   Chr11-5   0.99315  3190
## 483   AL027673     Chr02   Chr02-2   0.99320  3212
## 484   AL025332     Chr02   Chr02-2   0.99342  3322
## 485   AL025728     Chr03   Chr03-1   0.99346  6688
## 486   AC035261     Chr07   Chr07-3   0.99347  9733
## 487   AL024531     Chr02   Chr02-2   0.99349  6710
## 488   AC028730     Chr07   Chr07-2   0.99351  6732
## 489   AL032744     Chr11   Chr11-3   0.99355  3388
## 490   AC032947     Chr02   Chr02-1   0.99359  3410
## 491   AL032765     Chr10   Chr10-1   0.99361  6842
## 492   AL033398     Chr05   Chr05-4   0.99361  6842
## 493   AC025519     Chr07   Chr07-2   0.99361  9789
## 494   AC034470     Chr02   Chr02-1   0.99363  3432
## 495   AL030953     Chr07   Chr07-2   0.99364  9845
## 496   AL030767     Chr13   Chr13-1   0.99367  3454
## 497   AC031312     Chr11   Chr11-4   0.99371  3476
## 498   AL032028     Chr05   Chr05-6   0.99371  3476
## 499   AL033398     Chr13   Chr13-4   0.99371  3476
## 500   AC030629     Chr11   Chr11-2   0.99375  3498
## 501   AL029958     Chr05   Chr05-3   0.99375  3498
## 502   AL032236     Chr02   Chr02-1   0.99375  9854
## 503   AC025519     Chr10   Chr10-4   0.99375  9855
## 504   AL030541     Chr07   Chr07-1   0.99377  9889
## 505   AL032264     Chr13   Chr13-2   0.99383  3542
## 506   AL029974     Chr11   Chr11-1   0.99390  3586
## 507   AL033182     Chr05   Chr05-1   0.99396  7238
## 508   AC031997     Chr07   Chr07-2   0.99399  7282
## 509   AC025540     Chr02   Chr02-3   0.99401  7304
## 510   AL030767     Chr14   Chr14-1   0.99405  3674
## 511   AL029974     Chr09   Chr09-2   0.99412  3718
## 512   AL030230     Chr11   Chr11-2   0.99419  3762
## 513   AL032264     Chr09   Chr09-1   0.99419  3762
## 514   AL026884     Chr14   Chr14-2   0.99423  9820
## 515   AL029026     Chr11   Chr11-5   0.99425  3806
## 516   AL030116     Chr02   Chr02-1   0.99432  3850
## 517   AL032340     Chr05   Chr05-3   0.99438  3894
## 518   AL033228     Chr14   Chr14-1   0.99441  3916
## 519   AL026145     Chr07   Chr07-1   0.99449  9932
## 520   AL030237     Chr07   Chr07-1   0.99452  9793
## 521   AC031997     Chr11   Chr11-2   0.99454  4004
## 522   AL030328     Chr07   Chr07-1   0.99455  8030
## 523   AL032912     Chr09   Chr09-1   0.99457  4026
## 524   AL033217     Chr14   Chr14-2   0.99462  4070
## 525   AC035159     Chr09   Chr09-2   0.99464  8162
## 526   AL030931     Chr08   Chr08-1   0.99472  8294
## 527   AL030671     Chr10   Chr10-3   0.99476  4180
## 528   AL030581     Chr14   Chr14-1   0.99479  4202
## 529   AL027877     Chr11   Chr11-1   0.99482  4224
## 530   AC025640     Chr11   Chr11-4   0.99485  4246
## 531   AC025795     Chr07   Chr07-2   0.99485  8492
## 532   AL029975     Chr10   Chr10-1   0.99487  8536
## 533   AL024616     Chr14   Chr14-1   0.99492  4312
## 534   AL025031     Chr03   Chr03-1   0.99492  8624
## 535   AL028361     Chr09   Chr09-2   0.99492  8624
## 536   AL033217     Chr07   Chr07-1   0.99496  9866
## 537   AL025515     Chr02   Chr02-2   0.99497  8712
## 538   AC034050     Chr01   Chr01-1   1.00000   198
## 539   AL033070     Chr02   Chr02-2   1.00000   480
## 540   AL031062     Chr14   Chr14-2   1.00000   638
## 541   AL032236     Chr13   Chr13-1   1.00000   726
## 542   AL030634     Chr09   Chr09-1   1.00000   880
## 543   AL025332     Chr09   Chr09-1   1.00000   968
## 544   AC028730     Chr08   Chr08-2   1.00000  1012
## 545   AL031366     Chr01   Chr01-1   1.00000  1034
## 546   AC033409     Chr09   Chr09-1   1.00000  1122
## 547   AL028427     Chr01   Chr01-1   1.00000  1122
## 548   AL028365     Chr08   Chr08-1   1.00000  1166
## 549   AL032028     Chr11   Chr11-3   1.00000  1166
## 550   AL032715     Chr01   Chr01-1   1.00000  1188
## 551   AL029958     Chr02   Chr02-1   1.00000  1232
## 552   AL029975     Chr01   Chr01-2   1.00000  1232
## 553   AL032066     Chr13   Chr13-1   1.00000  1232
## 554   AL033070     Chr11   Chr11-2   1.00000  1254
## 555   AC029508     Chr01   Chr01-2   1.00000  1276
## 556   AL027357     Chr10   Chr10-3   1.00000  1276
## 557   AL032118     Chr13   Chr13-4   1.00000  1276
## 558   AL031862     Chr08   Chr08-2   1.00000  1298
## 559   AL024563     Chr09   Chr09-3   1.00000  1315
## 560   AC034529     Chr11   Chr11-2   1.00000  1320
## 561   AL030230     Chr01   Chr01-2   1.00000  1320
## 562   AC032947     Chr01   Chr01-1   1.00000  1342
## 563   AL030291     Chr01   Chr01-2   1.00000  1342
## 564   AL033029     Chr08   Chr08-2   1.00000  1386
## 565   AC031719     Chr10   Chr10-3   1.00000  1430
## 566   AL025114     Chr13   Chr13-1   1.00000  1430
## 567   AL030291     Chr13   Chr13-1   1.00000  1430
## 568   AL030065     Chr08   Chr08-1   1.00000  1452
## 569   AL032028     Chr13   Chr13-3   1.00000  1518
## 570   AL028365     Chr09   Chr09-1   1.00000  1526
## 571   AL025743     Chr10   Chr10-3   1.00000  1562
## 572   AL029974     Chr02   Chr02-1   1.00000  1584
## 573   AL026659     Chr01   Chr01-1   1.00000  1606
## 574   AL030581     Chr13   Chr13-1   1.00000  1606
## 575   AL026884     Chr09   Chr09-2   1.00000  1628
## 576   AC036291     Chr09   Chr09-1   1.00000  1650
## 577   AL025075     Chr01   Chr01-1   1.00000  1650
## 578   AL026528     Chr09   Chr09-2   1.00000  1650
## 579   AL031862     Chr01   Chr01-1   1.00000  1672
## 580   AL025114     Chr09   Chr09-1   1.00000  1694
## 581   AL026345     Chr09   Chr09-2   1.00000  1694
## 582   AL027486     Chr01   Chr01-1   1.00000  1694
## 583   AL028928     Chr01   Chr01-1   1.00000  1738
## 584   AL030022     Chr09   Chr09-1   1.00000  1738
## 585   AC033642     Chr09   Chr09-2   1.00000  1760
## 586   AL030931     Chr01   Chr01-1   1.00000  1760
## 587   AC030405     Chr01   Chr01-1   1.00000  1804
## 588   AL027757     Chr09   Chr09-1   1.00000  1825
## 589   AL026609     Chr13   Chr13-2   1.00000  1826
## 590   AL033182     Chr13   Chr13-1   1.00000  1826
## 591   AL024563     Chr01   Chr01-1   1.00000  1848
## 592   AL026609     Chr01   Chr01-1   1.00000  1848
## 593   AL030953     Chr08   Chr08-2   1.00000  1870
## 594   AL033228     Chr08   Chr08-2   1.00000  1870
## 595   AC036291     Chr13   Chr13-5   1.00000  1892
## 596   AL032411     Chr08   Chr08-1   1.00000  1892
## 597   AL029974     Chr13   Chr13-1   1.00000  1914
## 598   AL024616     Chr08   Chr08-2   1.00000  1936
## 599   AL028928     Chr08   Chr08-1   1.00000  1936
## 600   AL028964     Chr02   Chr02-1   1.00000  1936
## 601   AL032119     Chr13   Chr13-3   1.00000  1936
## 602   AL033029     Chr01   Chr01-2   1.00000  1958
## 603   AL025336     Chr08   Chr08-1   1.00000  1980
## 604   AC033016     Chr01   Chr01-2   1.00000  2002
## 605   AC035261     Chr09   Chr09-1   1.00000  2002
## 606   AL026528     Chr13   Chr13-1   1.00000  2002
## 607   AL030230     Chr13   Chr13-1   1.00000  2002
## 608   AL032411     Chr13   Chr13-2   1.00000  2002
## 609   AC032492     Chr13   Chr13-1   1.00000  2046
## 610   AL025332     Chr13   Chr13-1   1.00000  2046
## 611   AC035959     Chr09   Chr09-2   1.00000  2057
## 612   AL032119     Chr01   Chr01-1   1.00000  2068
## 613   AL032744     Chr13   Chr13-3   1.00000  2068
## 614   AL029755     Chr02   Chr02-2   1.00000  2112
## 615   AL032744     Chr01   Chr01-1   1.00000  2112
## 616   AL026345     Chr08   Chr08-1   1.00000  2134
## 617   AL026640     Chr08   Chr08-1   1.00000  2134
## 618   AL031382     Chr13   Chr13-1   1.00000  2134
## 619   AC029508     Chr08   Chr08-2   1.00000  2178
## 620   AL027877     Chr02   Chr02-1   1.00000  2200
## 621   AL029975     Chr11   Chr11-2   1.00000  2200
## 622   AL032500     Chr01   Chr01-3   1.00000  2200
## 623   AC033409     Chr14   Chr14-1   1.00000  2222
## 624   AC036291     Chr01   Chr01-1   1.00000  2222
## 625   AL030581     Chr11   Chr11-2   1.00000  2222
## 626   AC032492     Chr01   Chr01-2   1.00000  2244
## 627   AL030528     Chr11   Chr11-1   1.00000  2244
## 628   AL026528     Chr01   Chr01-2   1.00000  2266
## 629   AL032500     Chr13   Chr13-5   1.00000  2266
## 630   AL023523     Chr09   Chr09-3   1.00000  2288
## 631   AL027757     Chr08   Chr08-1   1.00000  2288
## 632   AL032066     Chr01   Chr01-2   1.00000  2288
## 633   AL028928     Chr09   Chr09-1   1.00000  2298
## 634   AL030328     Chr01   Chr01-1   1.00000  2332
## 635   AL025114     Chr01   Chr01-1   1.00000  2354
## 636   AL026345     Chr13   Chr13-1   1.00000  2354
## 637   AL030634     Chr11   Chr11-3   1.00000  2354
## 638   AL032028     Chr14   Chr14-2   1.00000  2354
## 639   AC029782     Chr09   Chr09-2   1.00000  2376
## 640   AC033409     Chr01   Chr01-1   1.00000  2376
## 641   AL025515     Chr01   Chr01-1   1.00000  2376
## 642   AL029071     Chr02   Chr02-2   1.00000  2376
## 643   AL029974     Chr01   Chr01-1   1.00000  2376
## 644   AL032340     Chr11   Chr11-2   1.00000  2376
## 645   AL026345     Chr02   Chr02-1   1.00000  2398
## 646   AL030541     Chr09   Chr09-2   1.00000  2398
## 647   AL033228     Chr13   Chr13-1   1.00000  2398
## 648   AL026609     Chr09   Chr09-1   1.00000  2420
## 649   AC029508     Chr09   Chr09-2   1.00000  2434
## 650   AL032066     Chr08   Chr08-2   1.00000  2442
## 651   AL032765     Chr13   Chr13-1   1.00000  2442
## 652   AC031312     Chr01   Chr01-1   1.00000  2464
## 653   AC033016     Chr09   Chr09-2   1.00000  2464
## 654   AL026884     Chr01   Chr01-1   1.00000  2464
## 655   AL027673     Chr01   Chr01-1   1.00000  2464
## 656   AL030114     Chr09   Chr09-2   1.00000  2464
## 657   AL030671     Chr11   Chr11-1   1.00000  2486
## 658   AL028375     Chr09   Chr09-1   1.00000  2508
## 659   AC027188     Chr11   Chr11-2   1.00000  2530
## 660   AC031719     Chr01   Chr01-1   1.00000  2530
## 661   AL026649     Chr02   Chr02-2   1.00000  2530
## 662   AL030116     Chr13   Chr13-5   1.00000  2530
## 663   AL032340     Chr13   Chr13-1   1.00000  2530
## 664   AL033098     Chr13   Chr13-1   1.00000  2530
## 665   AL027877     Chr09   Chr09-2   1.00000  2552
## 666   AL030671     Chr09   Chr09-3   1.00000  2552
## 667   AL025743     Chr01   Chr01-2   1.00000  2574
## 668   AL026486     Chr09   Chr09-1   1.00000  2574
## 669   AL030528     Chr13   Chr13-4   1.00000  2574
## 670   AL030500     Chr09   Chr09-2   1.00000  2596
## 671   AL032119     Chr08   Chr08-3   1.00000  2596
## 672   AL033228     Chr01   Chr01-2   1.00000  2596
## 673   AC036378     Chr09   Chr09-1   1.00000  2618
## 674   AL030073     Chr05   Chr05-1   1.00000  2618
## 675   AL028971     Chr09   Chr09-3   1.00000  2625
## 676   AL026486     Chr05   Chr05-4   1.00000  2640
## 677   AL030116     Chr05   Chr05-2   1.00000  2640
## 678   AL025075     Chr13   Chr13-2   1.00000  2662
## 679   AL025230     Chr11   Chr11-1   1.00000  2662
## 680   AL028964     Chr01   Chr01-2   1.00000  2662
## 681   AL030237     Chr01   Chr01-2   1.00000  2662
## 682   AL026738     Chr11   Chr11-3   1.00000  2684
## 683   AL027357     Chr02   Chr02-1   1.00000  2706
## 684   AL031908     Chr13   Chr13-1   1.00000  2706
## 685   AL032028     Chr01   Chr01-1   1.00000  2706
## 686   AL026345     Chr11   Chr11-1   1.00000  2750
## 687   AL029071     Chr01   Chr01-1   1.00000  2750
## 688   AL030541     Chr13   Chr13-1   1.00000  2750
## 689   AL030552     Chr01   Chr01-2   1.00000  2750
## 690   AL032500     Chr14   Chr14-2   1.00000  2750
## 691   AC027188     Chr13   Chr13-1   1.00000  2772
## 692   AL027682     Chr08   Chr08-1   1.00000  2772
## 693   AC032492     Chr09   Chr09-2   1.00000  2794
## 694   AL024180     Chr09   Chr09-1   1.00000  2794
## 695   AL030671     Chr02   Chr02-3   1.00000  2794
## 696   AL024616     Chr01   Chr01-2   1.00000  2838
## 697   AL030073     Chr11   Chr11-4   1.00000  2838
## 698   AL032500     Chr09   Chr09-3   1.00000  2838
## 699   AL029975     Chr09   Chr09-2   1.00000  2860
## 700   AL030328     Chr02   Chr02-2   1.00000  2860
## 701   AL030581     Chr02   Chr02-1   1.00000  2860
## 702   AL029975     Chr08   Chr08-2   1.00000  2882
## 703   AL032912     Chr08   Chr08-1   1.00000  2882
## 704   AC030629     Chr09   Chr09-2   1.00000  2904
## 705   AL025031     Chr08   Chr08-1   1.00000  2904
## 706   AL030671     Chr13   Chr13-1   1.00000  2904
## 707   AL032118     Chr11   Chr11-4   1.00000  2904
## 708   AC025640     Chr09   Chr09-1   1.00000  2926
## 709   AL026884     Chr02   Chr02-2   1.00000  2926
## 710   AL029071     Chr13   Chr13-2   1.00000  2926
## 711   AL029755     Chr08   Chr08-1   1.00000  2926
## 712   AL029958     Chr09   Chr09-2   1.00000  2926
## 713   AL030073     Chr09   Chr09-1   1.00000  2926
## 714   AL030114     Chr11   Chr11-1   1.00000  2926
## 715   AC035178     Chr02   Chr02-2   1.00000  2970
## 716   AL031908     Chr11   Chr11-5   1.00000  2970
## 717   AL026468     Chr11   Chr11-1   1.00000  2992
## 718   AL028375     Chr01   Chr01-3   1.00000  2992
## 719   AL029017     Chr02   Chr02-1   1.00000  2992
## 720   AL024651     Chr02   Chr02-1   1.00000  3036
## 721   AL026609     Chr11   Chr11-3   1.00000  3036
## 722   AL032028     Chr08   Chr08-3   1.00000  3036
## 723   AL026647     Chr02   Chr02-2   1.00000  3058
## 724   AL027757     Chr01   Chr01-1   1.00000  3058
## 725   AL029071     Chr09   Chr09-2   1.00000  3058
## 726   AL033098     Chr11   Chr11-2   1.00000  3058
## 727   AC032497     Chr14   Chr14-1   1.00000  3080
## 728   AL030114     Chr02   Chr02-1   1.00000  3080
## 729   AC031997     Chr01   Chr01-2   1.00000  3102
## 730   AC030405     Chr11   Chr11-5   1.00000  3124
## 731   AC036291     Chr08   Chr08-2   1.00000  3124
## 732   AL032066     Chr03   Chr03-1   1.00000  3124
## 733   AL032066     Chr05   Chr05-3   1.00000  3124
## 734   AL024180     Chr13   Chr13-2   1.00000  3146
## 735   AL026738     Chr02   Chr02-2   1.00000  3146
## 736   AL032066     Chr14   Chr14-1   1.00000  3146
## 737   AC025640     Chr13   Chr13-2   1.00000  3190
## 738   AL024651     Chr09   Chr09-2   1.00000  3190
## 739   AL027486     Chr11   Chr11-3   1.00000  3190
## 740   AL032411     Chr14   Chr14-2   1.00000  3212
## 741   AC029782     Chr01   Chr01-1   1.00000  3234
## 742   AC032497     Chr09   Chr09-2   1.00000  3234
## 743   AC035333     Chr11   Chr11-1   1.00000  3234
## 744   AL024087     Chr11   Chr11-1   1.00000  3234
## 745   AL024616     Chr13   Chr13-1   1.00000  3234
## 746   AL030114     Chr13   Chr13-1   1.00000  3234
## 747   AL032340     Chr14   Chr14-1   1.00000  3234
## 748   AL028365     Chr02   Chr02-2   1.00000  3256
## 749   AL032500     Chr08   Chr08-3   1.00000  3256
## 750   AL026640     Chr09   Chr09-1   1.00000  3274
## 751   AC032492     Chr05   Chr05-1   1.00000  3278
## 752   AL027486     Chr13   Chr13-1   1.00000  3278
## 753   AC034470     Chr01   Chr01-1   1.00000  3300
## 754   AC034529     Chr08   Chr08-2   1.00000  3300
## 755   AL028427     Chr13   Chr13-4   1.00000  3300
## 756   AL031862     Chr03   Chr03-1   1.00000  3300
## 757   AL026640     Chr13   Chr13-1   1.00000  3322
## 758   AL032028     Chr03   Chr03-3   1.00000  3344
## 759   AC032497     Chr07   Chr07-2   1.00000  3366
## 760   AC036378     Chr02   Chr02-1   1.00000  3366
## 761   AL025743     Chr11   Chr11-1   1.00000  3366
## 762   AL030500     Chr02   Chr02-1   1.00000  3366
## 763   AL031908     Chr14   Chr14-2   1.00000  3366
## 764   AL032411     Chr11   Chr11-3   1.00000  3366
## 765   AC025540     Chr13   Chr13-2   1.00000  3388
## 766   AL023630     Chr01   Chr01-1   1.00000  3388
## 767   AL030541     Chr02   Chr02-1   1.00000  3388
## 768   AL026468     Chr09   Chr09-1   1.00000  3410
## 769   AL027682     Chr01   Chr01-1   1.00000  3410
## 770   AL031862     Chr13   Chr13-1   1.00000  3410
## 771   AL025114     Chr11   Chr11-1   1.00000  3432
## 772   AL031908     Chr09   Chr09-2   1.00000  3432
## 773   AL032264     Chr14   Chr14-2   1.00000  3432
## 774   AL033070     Chr01   Chr01-2   1.00000  3432
## 775   AL030528     Chr09   Chr09-1   1.00000  3443
## 776   AC030405     Chr14   Chr14-3   1.00000  3476
## 777   AC031312     Chr08   Chr08-3   1.00000  3476
## 778   AL024531     Chr09   Chr09-1   1.00000  3476
## 779   AL026649     Chr01   Chr01-1   1.00000  3476
## 780   AL028294     Chr13   Chr13-2   1.00000  3476
## 781   AL031448     Chr01   Chr01-1   1.00000  3476
## 782   AC025795     Chr09   Chr09-2   1.00000  3487
## 783   AL026468     Chr13   Chr13-1   1.00000  3498
## 784   AL031908     Chr08   Chr08-4   1.00000  3498
## 785   AL032912     Chr13   Chr13-4   1.00000  3498
## 786   AL030552     Chr02   Chr02-1   1.00000  3520
## 787   AL031862     Chr09   Chr09-2   1.00000  3520
## 788   AC032493     Chr13   Chr13-1   1.00000  3542
## 789   AC032820     Chr14   Chr14-3   1.00000  3542
## 790   AL030022     Chr05   Chr05-2   1.00000  3542
## 791   AL030022     Chr13   Chr13-2   1.00000  3542
## 792   AL030552     Chr09   Chr09-2   1.00000  3542
## 793   AC033016     Chr02   Chr02-1   1.00000  3564
## 794   AL029755     Chr11   Chr11-3   1.00000  3564
## 795   AC030629     Chr14   Chr14-1   1.00000  3586
## 796   AL033182     Chr11   Chr11-4   1.00000  3586
## 797   AC032492     Chr03   Chr03-1   1.00000  3608
## 798   AC027188     Chr14   Chr14-1   1.00000  3630
## 799   AL025728     Chr11   Chr11-1   1.00000  3630
## 800   AL032236     Chr11   Chr11-2   1.00000  3630
## 801   AC035333     Chr10   Chr10-2   1.00000  3652
## 802   AL026884     Chr11   Chr11-1   1.00000  3652
## 803   AL030065     Chr13   Chr13-1   1.00000  3652
## 804   AL032264     Chr11   Chr11-1   1.00000  3652
## 805   AL025075     Chr11   Chr11-4   1.00000  3674
## 806   AL030552     Chr11   Chr11-1   1.00000  3674
## 807   AL032028     Chr09   Chr09-3   1.00000  3674
## 808   AC035333     Chr09   Chr09-2   1.00000  3696
## 809   AL024635     Chr01   Chr01-1   1.00000  3696
## 810   AL025114     Chr08   Chr08-3   1.00000  3696
## 811   AC034050     Chr02   Chr02-1   1.00000  3718
## 812   AL030671     Chr14   Chr14-3   1.00000  3718
## 813   AL031448     Chr13   Chr13-3   1.00000  3718
## 814   AL024531     Chr13   Chr13-4   1.00000  3740
## 815   AC036291     Chr11   Chr11-1   1.00000  3762
## 816   AL026609     Chr08   Chr08-1   1.00000  3762
## 817   AC029782     Chr11   Chr11-5   1.00000  3784
## 818   AL026649     Chr11   Chr11-1   1.00000  3784
## 819   AL032340     Chr01   Chr01-2   1.00000  3784
## 820   AC031312     Chr02   Chr02-3   1.00000  3806
## 821   AL028365     Chr10   Chr10-1   1.00000  3806
## 822   AL029974     Chr08   Chr08-1   1.00000  3806
## 823   AC030629     Chr02   Chr02-1   1.00000  3828
## 824   AC036291     Chr03   Chr03-1   1.00000  3828
## 825   AL032437     Chr05   Chr05-3   1.00000  3828
## 826   AL026486     Chr11   Chr11-1   1.00000  3850
## 827   AL028375     Chr10   Chr10-2   1.00000  3850
## 828   AL026738     Chr09   Chr09-1   1.00000  3872
## 829   AL030500     Chr11   Chr11-1   1.00000  3872
## 830   AL030634     Chr13   Chr13-2   1.00000  3872
## 831   AC035178     Chr01   Chr01-1   1.00000  3894
## 832   AL030328     Chr13   Chr13-2   1.00000  3894
## 833   AL030541     Chr05   Chr05-1   1.00000  3894
## 834   AL025515     Chr09   Chr09-1   1.00000  3906
## 835   AL029755     Chr13   Chr13-2   1.00000  3916
## 836   AL030541     Chr11   Chr11-1   1.00000  3916
## 837   AC031312     Chr14   Chr14-2   1.00000  3938
## 838   AL026528     Chr11   Chr11-1   1.00000  3938
## 839   AL027877     Chr13   Chr13-1   1.00000  3938
## 840   AL030528     Chr14   Chr14-1   1.00000  3938
## 841   AC032493     Chr14   Chr14-1   1.00000  3960
## 842   AL027486     Chr10   Chr10-1   1.00000  3960
## 843   AL031366     Chr13   Chr13-1   1.00000  3960
## 844   AL031448     Chr14   Chr14-2   1.00000  3960
## 845   AC032497     Chr08   Chr08-2   1.00000  3982
## 846   AL030767     Chr11   Chr11-2   1.00000  3982
## 847   AL032744     Chr08   Chr08-3   1.00000  3982
## 848   AL026640     Chr11   Chr11-1   1.00000  4004
## 849   AL029958     Chr13   Chr13-1   1.00000  4004
## 850   AL032765     Chr09   Chr09-2   1.00000  4004
## 851   AC032492     Chr11   Chr11-2   1.00000  4026
## 852   AL024180     Chr02   Chr02-2   1.00000  4026
## 853   AL032066     Chr02   Chr02-1   1.00000  4026
## 854   AC035333     Chr01   Chr01-1   1.00000  4048
## 855   AL025230     Chr13   Chr13-1   1.00000  4048
## 856   AL025332     Chr11   Chr11-1   1.00000  4048
## 857   AL032119     Chr09   Chr09-3   1.00000  4048
## 858   AL029017     Chr13   Chr13-1   1.00000  4070
## 859   AL031862     Chr02   Chr02-2   1.00000  4070
## 860   AL032340     Chr08   Chr08-2   1.00000  4114
## 861   AC033642     Chr11   Chr11-5   1.00000  4158
## 862   AL026468     Chr01   Chr01-1   1.00000  4180
## 863   AC032492     Chr02   Chr02-1   1.00000  4202
## 864   AL024656     Chr02   Chr02-1   1.00000  4224
## 865   AL025031     Chr02   Chr02-2   1.00000  4224
## 866   AL025230     Chr05   Chr05-1   1.00000  4224
## 867   AL026647     Chr13   Chr13-2   1.00000  4224
## 868   AC030629     Chr01   Chr01-2   1.00000  4246
## 869   AC032492     Chr07   Chr07-2   1.00000  4246
## 870   AC033016     Chr07   Chr07-2   1.00000  4246
## 871   AL031908     Chr01   Chr01-1   1.00000  4246
## 872   AC025519     Chr11   Chr11-1   1.00000  4290
## 873   AC032502     Chr01   Chr01-2   1.00000  4312
## 874   AL026528     Chr05   Chr05-1   1.00000  4312
## 875   AL032236     Chr03   Chr03-1   1.00000  4312
## 876   AL032715     Chr08   Chr08-3   1.00000  4312
## 877   AL027757     Chr13   Chr13-1   1.00000  4334
## 878   AL028375     Chr05   Chr05-3   1.00000  4334
## 879   AL026609     Chr14   Chr14-2   1.00000  4356
## 880   AL029017     Chr11   Chr11-2   1.00000  4356
## 881   AL029755     Chr05   Chr05-2   1.00000  4356
## 882   AL024651     Chr11   Chr11-2   1.00000  4378
## 883   AL027486     Chr09   Chr09-1   1.00000  4378
## 884   AL030022     Chr02   Chr02-2   1.00000  4378
## 885   AL030541     Chr08   Chr08-1   1.00000  4378
## 886   AL032500     Chr03   Chr03-3   1.00000  4378
## 887   AL025743     Chr05   Chr05-1   1.00000  4400
## 888   AL026884     Chr13   Chr13-2   1.00000  4400
## 889   AL030931     Chr11   Chr11-1   1.00000  4400
## 890   AL031448     Chr11   Chr11-3   1.00000  4400
## 891   AL032118     Chr02   Chr02-1   1.00000  4400
## 892   AL032912     Chr11   Chr11-5   1.00000  4400
## 893   AL026345     Chr05   Chr05-1   1.00000  4422
## 894   AL027357     Chr08   Chr08-2   1.00000  4422
## 895   AL033396     Chr13   Chr13-1   1.00000  4422
## 896   AL031448     Chr09   Chr09-3   1.00000  4444
## 897   AC032493     Chr10   Chr10-1   1.00000  4466
## 898   AL030500     Chr08   Chr08-1   1.00000  4466
## 899   AL031062     Chr01   Chr01-2   1.00000  4466
## 900   AC032492     Chr10   Chr10-1   1.00000  4488
## 901   AL030065     Chr11   Chr11-1   1.00000  4488
## 902   AL032744     Chr09   Chr09-3   1.00000  4488
## 903   AC033642     Chr13   Chr13-3   1.00000  4510
## 904   AL024180     Chr01   Chr01-1   1.00000  4510
## 905   AL030552     Chr13   Chr13-1   1.00000  4532
## 906   AL024656     Chr09   Chr09-1   1.00000  4576
## 907   AL025114     Chr02   Chr02-3   1.00000  4576
## 908   AL033228     Chr09   Chr09-2   1.00000  4576
## 909   AC032497     Chr13   Chr13-1   1.00000  4598
## 910   AC032502     Chr03   Chr03-1   1.00000  4598
## 911   AC032947     Chr14   Chr14-3   1.00000  4598
## 912   AC034050     Chr03   Chr03-1   1.00000  4620
## 913   AL024563     Chr05   Chr05-1   1.00000  4620
## 914   AL025743     Chr13   Chr13-1   1.00000  4620
## 915   AL032765     Chr11   Chr11-2   1.00000  4620
## 916   AL030767     Chr02   Chr02-1   1.00000  4642
## 917   AL024651     Chr01   Chr01-2   1.00000  4664
## 918   AL029974     Chr05   Chr05-1   1.00000  4664
## 919   AL032765     Chr05   Chr05-3   1.00000  4664
## 920   AC031312     Chr13   Chr13-2   1.00000  4686
## 921   AC034529     Chr09   Chr09-2   1.00000  4686
## 922   AL025728     Chr01   Chr01-1   1.00000  4686
## 923   AL025765     Chr13   Chr13-3   1.00000  4686
## 924   AL025736     Chr13   Chr13-2   1.00000  4708
## 925   AL026145     Chr13   Chr13-2   1.00000  4708
## 926   AC032493     Chr02   Chr02-1   1.00000  4730
## 927   AL033098     Chr10   Chr10-1   1.00000  4730
## 928   AL024635     Chr09   Chr09-1   1.00000  4744
## 929   AC029782     Chr03   Chr03-1   1.00000  4752
## 930   AC032502     Chr02   Chr02-1   1.00000  4752
## 931   AL026659     Chr09   Chr09-1   1.00000  4752
## 932   AL028971     Chr02   Chr02-3   1.00000  4752
## 933   AL030552     Chr08   Chr08-2   1.00000  4752
## 934   AL032118     Chr09   Chr09-3   1.00000  4752
## 935   AC034279     Chr14   Chr14-1   1.00000  4774
## 936   AC036378     Chr01   Chr01-1   1.00000  4774
## 937   AL031448     Chr08   Chr08-3   1.00000  4774
## 938   AC032493     Chr09   Chr09-2   1.00000  4796
## 939   AC032502     Chr07   Chr07-2   1.00000  4796
## 940   AC032502     Chr14   Chr14-1   1.00000  4796
## 941   AL032340     Chr03   Chr03-1   1.00000  4796
## 942   AC029782     Chr13   Chr13-3   1.00000  4818
## 943   AC032497     Chr01   Chr01-2   1.00000  4818
## 944   AL032118     Chr03   Chr03-1   1.00000  4818
## 945   AC031997     Chr10   Chr10-1   1.00000  4840
## 946   AC032502     Chr09   Chr09-2   1.00000  4862
## 947   AL032765     Chr03   Chr03-1   1.00000  4862
## 948   AC030629     Chr13   Chr13-1   1.00000  4884
## 949   AL026647     Chr09   Chr09-1   1.00000  4884
## 950   AL032715     Chr11   Chr11-3   1.00000  4884
## 951   AL030767     Chr01   Chr01-2   1.00000  4928
## 952   AC034470     Chr09   Chr09-1   1.00000  4972
## 953   AC034529     Chr01   Chr01-2   1.00000  4972
## 954   AL030022     Chr10   Chr10-1   1.00000  4972
## 955   AL033070     Chr03   Chr03-1   1.00000  4972
## 956   AC032497     Chr10   Chr10-1   1.00000  4994
## 957   AC034279     Chr02   Chr02-1   1.00000  4994
## 958   AC036378     Chr13   Chr13-4   1.00000  4994
## 959   AL029755     Chr09   Chr09-1   1.00000  4994
## 960   AL032500     Chr10   Chr10-2   1.00000  4994
## 961   AC025795     Chr14   Chr14-2   1.00000  5016
## 962   AC030871     Chr01   Chr01-2   1.00000  5016
## 963   AL031908     Chr05   Chr05-2   1.00000  5016
## 964   AL029958     Chr03   Chr03-1   1.00000  5038
## 965   AC030871     Chr05   Chr05-8   1.00000  5060
## 966   AL024616     Chr02   Chr02-1   1.00000  5060
## 967   AL026528     Chr08   Chr08-2   1.00000  5060
## 968   AC025795     Chr13   Chr13-2   1.00000  5082
## 969   AL025031     Chr10   Chr10-1   1.00000  5082
## 970   AL026738     Chr08   Chr08-1   1.00000  5082
## 971   AL030767     Chr08   Chr08-2   1.00000  5082
## 972   AL032411     Chr05   Chr05-2   1.00000  5082
## 973   AL033182     Chr09   Chr09-3   1.00000  5092
## 974   AL028964     Chr13   Chr13-1   1.00000  5104
## 975   AL030528     Chr03   Chr03-3   1.00000  5104
## 976   AL033228     Chr05   Chr05-3   1.00000  5104
## 977   AC036291     Chr02   Chr02-1   1.00000  5126
## 978   AC025640     Chr02   Chr02-3   1.00000  5148
## 979   AC032947     Chr05   Chr05-1   1.00000  5148
## 980   AL029071     Chr05   Chr05-2   1.00000  5148
## 981   AL030114     Chr14   Chr14-1   1.00000  5148
## 982   AL031062     Chr09   Chr09-2   1.00000  5148
## 983   AL033217     Chr08   Chr08-1   1.00000  5148
## 984   AC032493     Chr11   Chr11-2   1.00000  5170
## 985   AC032947     Chr07   Chr07-3   1.00000  5170
## 986   AC032947     Chr10   Chr10-2   1.00000  5170
## 987   AL027757     Chr02   Chr02-1   1.00000  5170
## 988   AL032264     Chr03   Chr03-2   1.00000  5170
## 989   AL025728     Chr09   Chr09-1   1.00000  5192
## 990   AL024651     Chr03   Chr03-2   1.00000  5214
## 991   AL033098     Chr14   Chr14-1   1.00000  5214
## 992   AC028730     Chr11   Chr11-2   1.00000  5236
## 993   AC030405     Chr13   Chr13-3   1.00000  5236
## 994   AL032437     Chr10   Chr10-1   1.00000  5236
## 995   AC029782     Chr08   Chr08-3   1.00000  5258
## 996   AL024531     Chr14   Chr14-2   1.00000  5258
## 997   AL026468     Chr02   Chr02-3   1.00000  5258
## 998   AL031382     Chr11   Chr11-2   1.00000  5258
## 999   AC033409     Chr11   Chr11-1   1.00000  5280
## 1000  AL025075     Chr02   Chr02-4   1.00000  5280
## 1001  AL025515     Chr11   Chr11-3   1.00000  5280
## 1002  AL026647     Chr14   Chr14-2   1.00000  5280
## 1003  AL026738     Chr13   Chr13-2   1.00000  5280
## 1004  AC027188     Chr10   Chr10-1   1.00000  5302
## 1005  AC030629     Chr05   Chr05-1   1.00000  5302
## 1006  AC035333     Chr08   Chr08-3   1.00000  5302
## 1007  AL032119     Chr02   Chr02-3   1.00000  5302
## 1008  AL033217     Chr05   Chr05-2   1.00000  5302
## 1009  AL025743     Chr02   Chr02-1   1.00000  5324
## 1010  AL026649     Chr09   Chr09-1   1.00000  5346
## 1011  AL033217     Chr09   Chr09-1   1.00000  5390
## 1012  AL033398     Chr14   Chr14-2   1.00000  5390
## 1013  AC029508     Chr11   Chr11-2   1.00000  5412
## 1014  AL024616     Chr11   Chr11-2   1.00000  5412
## 1015  AL030953     Chr05   Chr05-1   1.00000  5412
## 1016  AC027188     Chr05   Chr05-1   1.00000  5434
## 1017  AC028231     Chr01   Chr01-1   1.00000  5434
## 1018  AL024180     Chr14   Chr14-2   1.00000  5434
## 1019  AC031312     Chr07   Chr07-3   1.00000  5456
## 1020  AL025075     Chr10   Chr10-1   1.00000  5456
## 1021  AL026528     Chr02   Chr02-1   1.00000  5456
## 1022  AL026528     Chr07   Chr07-1   1.00000  5456
## 1023  AL030912     Chr08   Chr08-2   1.00000  5478
## 1024  AC030629     Chr08   Chr08-2   1.00000  5522
## 1025  AC031719     Chr13   Chr13-2   1.00000  5522
## 1026  AL033029     Chr11   Chr11-2   1.00000  5522
## 1027  AL033070     Chr05   Chr05-3   1.00000  5522
## 1028  AC030629     Chr07   Chr07-2   1.00000  5544
## 1029  AL026178     Chr08   Chr08-3   1.00000  5544
## 1030  AL030328     Chr11   Chr11-3   1.00000  5544
## 1031  AC032820     Chr10   Chr10-2   1.00000  5566
## 1032  AL024563     Chr11   Chr11-4   1.00000  5566
## 1033  AL027357     Chr13   Chr13-1   1.00000  5566
## 1034  AC032820     Chr13   Chr13-3   1.00000  5588
## 1035  AC035159     Chr11   Chr11-2   1.00000  5588
## 1036  AL027357     Chr14   Chr14-1   1.00000  5588
## 1037  AL030634     Chr02   Chr02-2   1.00000  5588
## 1038  AC035178     Chr07   Chr07-1   1.00000  5610
## 1039  AL033182     Chr14   Chr14-2   1.00000  5610
## 1040  AC029508     Chr13   Chr13-1   1.00000  5632
## 1041  AL032340     Chr10   Chr10-1   1.00000  5632
## 1042  AL032411     Chr10   Chr10-1   1.00000  5632
## 1043  AC029782     Chr02   Chr02-1   1.00000  5654
## 1044  AL026738     Chr05   Chr05-2   1.00000  5654
## 1045  AL029071     Chr07   Chr07-1   1.00000  5654
## 1046  AL030953     Chr02   Chr02-1   1.00000  5676
## 1047  AL031062     Chr08   Chr08-2   1.00000  5676
## 1048  AL032744     Chr05   Chr05-6   1.00000  5676
## 1049  AC032502     Chr08   Chr08-2   1.00000  5720
## 1050  AL033070     Chr10   Chr10-1   1.00000  5720
## 1051  AC034050     Chr10   Chr10-1   1.00000  5742
## 1052  AL028964     Chr09   Chr09-2   1.00000  5742
## 1053  AC025640     Chr05   Chr05-2   1.00000  5764
## 1054  AC033016     Chr14   Chr14-1   1.00000  5764
## 1055  AL032912     Chr14   Chr14-2   1.00000  5764
## 1056  AL033398     Chr11   Chr11-5   1.00000  5764
## 1057  AL025230     Chr09   Chr09-2   1.00000  5786
## 1058  AL026528     Chr14   Chr14-1   1.00000  5786
## 1059  AL027877     Chr08   Chr08-2   1.00000  5786
## 1060  AC035178     Chr14   Chr14-2   1.00000  5808
## 1061  AL025728     Chr08   Chr08-1   1.00000  5852
## 1062  AL024651     Chr07   Chr07-2   1.00000  5874
## 1063  AL032264     Chr05   Chr05-2   1.00000  5874
## 1064  AL032236     Chr05   Chr05-1   1.00000  5896
## 1065  AL032912     Chr05   Chr05-4   1.00000  5896
## 1066  AL033029     Chr09   Chr09-2   1.00000  5896
## 1067  AC032820     Chr01   Chr01-1   1.00000  5918
## 1068  AL030912     Chr13   Chr13-4   1.00000  5918
## 1069  AC031312     Chr05   Chr05-1   1.00000  5940
## 1070  AC031719     Chr11   Chr11-1   1.00000  5940
## 1071  AL031908     Chr10   Chr10-1   1.00000  5940
## 1072  AC033016     Chr13   Chr13-1   1.00000  5962
## 1073  AC035178     Chr11   Chr11-1   1.00000  5962
## 1074  AL027877     Chr05   Chr05-1   1.00000  5962
## 1075  AL031908     Chr03   Chr03-1   1.00000  5962
## 1076  AL028294     Chr09   Chr09-2   1.00000  5976
## 1077  AC032502     Chr10   Chr10-1   1.00000  5984
## 1078  AL028971     Chr13   Chr13-1   1.00000  5984
## 1079  AC035261     Chr13   Chr13-2   1.00000  6006
## 1080  AC036291     Chr05   Chr05-1   1.00000  6006
## 1081  AL024656     Chr14   Chr14-1   1.00000  6006
## 1082  AL030073     Chr14   Chr14-2   1.00000  6006
## 1083  AC027188     Chr01   Chr01-2   1.00000  6028
## 1084  AC034529     Chr10   Chr10-1   1.00000  6028
## 1085  AL027673     Chr11   Chr11-1   1.00000  6028
## 1086  AC029782     Chr14   Chr14-3   1.00000  6050
## 1087  AL026528     Chr03   Chr03-1   1.00000  6050
## 1088  AL026738     Chr10   Chr10-1   1.00000  6050
## 1089  AC034529     Chr13   Chr13-1   1.00000  6072
## 1090  AC034279     Chr11   Chr11-1   1.00000  6094
## 1091  AL030931     Chr09   Chr09-1   1.00000  6113
## 1092  AL024087     Chr02   Chr02-1   1.00000  6116
## 1093  AL025031     Chr05   Chr05-2   1.00000  6116
## 1094  AC034529     Chr02   Chr02-1   1.00000  6138
## 1095  AL029975     Chr14   Chr14-1   1.00000  6160
## 1096  AL030767     Chr05   Chr05-5   1.00000  6160
## 1097  AC036378     Chr11   Chr11-1   1.00000  6182
## 1098  AL024563     Chr13   Chr13-4   1.00000  6182
## 1099  AL024180     Chr03   Chr03-1   1.00000  6226
## 1100  AL030767     Chr10   Chr10-1   1.00000  6226
## 1101  AC025540     Chr08   Chr08-3   1.00000  6248
## 1102  AL030552     Chr05   Chr05-1   1.00000  6248
## 1103  AL030931     Chr05   Chr05-4   1.00000  6248
## 1104  AL030953     Chr10   Chr10-1   1.00000  6292
## 1105  AL033217     Chr03   Chr03-1   1.00000  6292
## 1106  AC025640     Chr01   Chr01-2   1.00000  6314
## 1107  AL024531     Chr10   Chr10-1   1.00000  6314
## 1108  AC032497     Chr03   Chr03-1   1.00000  6336
## 1109  AC033016     Chr11   Chr11-2   1.00000  6336
## 1110  AL026659     Chr10   Chr10-1   1.00000  6336
## 1111  AL027877     Chr07   Chr07-1   1.00000  6358
## 1112  AL033396     Chr14   Chr14-1   1.00000  6358
## 1113  AC033409     Chr02   Chr02-1   1.00000  6380
## 1114  AL032744     Chr03   Chr03-3   1.00000  6380
## 1115  AC033409     Chr05   Chr05-1   1.00000  6402
## 1116  AL028427     Chr14   Chr14-3   1.00000  6402
## 1117  AL030328     Chr05   Chr05-2   1.00000  6402
## 1118  AL027673     Chr09   Chr09-1   1.00000  6424
## 1119  AC032497     Chr11   Chr11-2   1.00000  6446
## 1120  AL025743     Chr08   Chr08-1   1.00000  6446
## 1121  AL028375     Chr07   Chr07-2   1.00000  6446
## 1122  AL030291     Chr05   Chr05-3   1.00000  6446
## 1123  AL023523     Chr02   Chr02-3   1.00000  6512
## 1124  AL029755     Chr10   Chr10-1   1.00000  6512
## 1125  AL029958     Chr10   Chr10-1   1.00000  6512
## 1126  AL033398     Chr09   Chr09-1   1.00000  6514
## 1127  AL031448     Chr03   Chr03-3   1.00000  6556
## 1128  AC034050     Chr08   Chr08-2   1.00000  6578
## 1129  AC031719     Chr05   Chr05-8   1.00000  6600
## 1130  AL030912     Chr01   Chr01-1   1.00000  6600
## 1131  AL030767     Chr09   Chr09-2   1.00000  6622
## 1132  AL030022     Chr14   Chr14-2   1.00000  6666
## 1133  AC031719     Chr03   Chr03-1   1.00000  6688
## 1134  AC033642     Chr10   Chr10-2   1.00000  6688
## 1135  AC035178     Chr08   Chr08-3   1.00000  6688
## 1136  AC025640     Chr07   Chr07-3   1.00000  6710
## 1137  AL023630     Chr13   Chr13-1   1.00000  6710
## 1138  AL027486     Chr07   Chr07-1   1.00000  6710
## 1139  AL027682     Chr13   Chr13-2   1.00000  6710
## 1140  AL033098     Chr03   Chr03-1   1.00000  6710
## 1141  AC030871     Chr09   Chr09-2   1.00000  6732
## 1142  AC036378     Chr05   Chr05-4   1.00000  6732
## 1143  AL025075     Chr03   Chr03-1   1.00000  6732
## 1144  AL030237     Chr08   Chr08-2   1.00000  6732
## 1145  AL031862     Chr10   Chr10-1   1.00000  6754
## 1146  AL024651     Chr10   Chr10-1   1.00000  6776
## 1147  AC034050     Chr09   Chr09-2   1.00000  6798
## 1148  AL030912     Chr14   Chr14-2   1.00000  6798
## 1149  AL032500     Chr02   Chr02-2   1.00000  6798
## 1150  AC035333     Chr14   Chr14-2   1.00000  6820
## 1151  AL026884     Chr10   Chr10-2   1.00000  6820
## 1152  AL030073     Chr02   Chr02-3   1.00000  6820
## 1153  AL028365     Chr11   Chr11-3   1.00000  6842
## 1154  AL028971     Chr10   Chr10-3   1.00000  6842
## 1155  AL024635     Chr13   Chr13-1   1.00000  6864
## 1156  AL030291     Chr07   Chr07-2   1.00000  6864
## 1157  AL032912     Chr03   Chr03-3   1.00000  6886
## 1158  AL025736     Chr07   Chr07-5   1.00000  6908
## 1159  AL030328     Chr08   Chr08-1   1.00000  6908
## 1160  AC031997     Chr08   Chr08-2   1.00000  6930
## 1161  AL029974     Chr03   Chr03-1   1.00000  6930
## 1162  AL028294     Chr11   Chr11-1   1.00000  6974
## 1163  AL028964     Chr11   Chr11-1   1.00000  6974
## 1164  AL033228     Chr11   Chr11-2   1.00000  6974
## 1165  AL024616     Chr05   Chr05-1   1.00000  6996
## 1166  AL024656     Chr05   Chr05-4   1.00000  6996
## 1167  AL033396     Chr09   Chr09-2   1.00000  6996
## 1168  AC032502     Chr05   Chr05-1   1.00000  7018
## 1169  AC032502     Chr13   Chr13-1   1.00000  7018
## 1170  AC035959     Chr05   Chr05-1   1.00000  7040
## 1171  AL030912     Chr09   Chr09-3   1.00000  7055
## 1172  AC034529     Chr05   Chr05-1   1.00000  7062
## 1173  AL029974     Chr10   Chr10-1   1.00000  7062
## 1174  AL033217     Chr10   Chr10-1   1.00000  7062
## 1175  AC035178     Chr05   Chr05-2   1.00000  7084
## 1176  AL026145     Chr11   Chr11-3   1.00000  7084
## 1177  AL032340     Chr02   Chr02-1   1.00000  7084
## 1178  AL027877     Chr01   Chr01-2   1.00000  7106
## 1179  AL028361     Chr14   Chr14-1   1.00000  7150
## 1180  AL030114     Chr10   Chr10-1   1.00000  7150
## 1181  AL032066     Chr09   Chr09-2   1.00000  7172
## 1182  AL028427     Chr09   Chr09-1   1.00000  7175
## 1183  AC028730     Chr13   Chr13-1   1.00000  7194
## 1184  AL028928     Chr13   Chr13-3   1.00000  7194
## 1185  AC034279     Chr05   Chr05-1   1.00000  7216
## 1186  AL030328     Chr09   Chr09-1   1.00000  7230
## 1187  AC031997     Chr13   Chr13-1   1.00000  7238
## 1188  AL027673     Chr10   Chr10-1   1.00000  7238
## 1189  AL025743     Chr07   Chr07-1   1.00000  7260
## 1190  AL025736     Chr09   Chr09-1   1.00000  7271
## 1191  AL025336     Chr02   Chr02-1   1.00000  7282
## 1192  AL025114     Chr03   Chr03-3   1.00000  7304
## 1193  AL030671     Chr03   Chr03-2   1.00000  7304
## 1194  AL024531     Chr05   Chr05-4   1.00000  7326
## 1195  AL026647     Chr07   Chr07-1   1.00000  7326
## 1196  AC027188     Chr03   Chr03-1   1.00000  7348
## 1197  AL033228     Chr10   Chr10-1   1.00000  7370
## 1198  AC025540     Chr03   Chr03-1   1.00000  7392
## 1199  AL031366     Chr02   Chr02-1   1.00000  7392
## 1200  AL027682     Chr02   Chr02-2   1.00000  7414
## 1201  AL030541     Chr03   Chr03-1   1.00000  7414
## 1202  AC035159     Chr13   Chr13-1   1.00000  7436
## 1203  AL025075     Chr07   Chr07-2   1.00000  7436
## 1204  AL032715     Chr05   Chr05-6   1.00000  7436
## 1205  AC025640     Chr10   Chr10-2   1.00000  7458
## 1206  AC032820     Chr03   Chr03-1   1.00000  7458
## 1207  AC032820     Chr05   Chr05-1   1.00000  7458
## 1208  AC034470     Chr07   Chr07-1   1.00000  7458
## 1209  AL030500     Chr03   Chr03-2   1.00000  7458
## 1210  AL026178     Chr09   Chr09-1   1.00000  7476
## 1211  AC025540     Chr01   Chr01-1   1.00000  7480
## 1212  AC030405     Chr05   Chr05-1   1.00000  7480
## 1213  AL030237     Chr13   Chr13-2   1.00000  7480
## 1214  AL033396     Chr01   Chr01-2   1.00000  7480
## 1215  AL032765     Chr02   Chr02-1   1.00000  7502
## 1216  AL031366     Chr03   Chr03-1   1.00000  7524
## 1217  AL031382     Chr14   Chr14-1   1.00000  7524
## 1218  AL030552     Chr03   Chr03-1   1.00000  7568
## 1219  AL030581     Chr05   Chr05-1   1.00000  7568
## 1220  AC031312     Chr10   Chr10-2   1.00000  7590
## 1221  AL028294     Chr14   Chr14-1   1.00000  7590
## 1222  AC025795     Chr11   Chr11-1   1.00000  7634
## 1223  AL025743     Chr14   Chr14-1   1.00000  7634
## 1224  AL030237     Chr03   Chr03-1   1.00000  7634
## 1225  AL024180     Chr08   Chr08-1   1.00000  7656
## 1226  AL032715     Chr03   Chr03-3   1.00000  7656
## 1227  AL025515     Chr13   Chr13-2   1.00000  7661
## 1228  AC031719     Chr07   Chr07-3   1.00000  7678
## 1229  AL026659     Chr08   Chr08-1   1.00000  7678
## 1230  AL030073     Chr10   Chr10-3   1.00000  7678
## 1231  AC029782     Chr10   Chr10-2   1.00000  7700
## 1232  AL026609     Chr07   Chr07-1   1.00000  7700
## 1233  AC034279     Chr03   Chr03-1   1.00000  7722
## 1234  AL024087     Chr13   Chr13-1   1.00000  7737
## 1235  AL025728     Chr10   Chr10-1   1.00000  7766
## 1236  AC033016     Chr05   Chr05-1   1.00000  7788
## 1237  AC033642     Chr03   Chr03-1   1.00000  7788
## 1238  AL023523     Chr13   Chr13-3   1.00000  7789
## 1239  AC035159     Chr01   Chr01-2   1.00000  7810
## 1240  AL024180     Chr10   Chr10-1   1.00000  7810
## 1241  AL026486     Chr02   Chr02-1   1.00000  7832
## 1242  AL031382     Chr02   Chr02-1   1.00000  7854
## 1243  AL029975     Chr05   Chr05-5   1.00000  7876
## 1244  AC036378     Chr08   Chr08-1   1.00000  7898
## 1245  AL025114     Chr14   Chr14-2   1.00000  7898
## 1246  AC035333     Chr03   Chr03-2   1.00000  7920
## 1247  AL025743     Chr09   Chr09-2   1.00000  7920
## 1248  AL025765     Chr14   Chr14-2   1.00000  7920
## 1249  AC032493     Chr05   Chr05-1   1.00000  7942
## 1250  AL026884     Chr03   Chr03-2   1.00000  7942
## 1251  AL029071     Chr14   Chr14-2   1.00000  7942
## 1252  AC028730     Chr14   Chr14-1   1.00000  7964
## 1253  AL024563     Chr02   Chr02-2   1.00000  7964
## 1254  AC034529     Chr14   Chr14-1   1.00000  7986
## 1255  AL028361     Chr13   Chr13-1   1.00000  7986
## 1256  AL029975     Chr03   Chr03-2   1.00000  7986
## 1257  AL033396     Chr05   Chr05-5   1.00000  7986
## 1258  AC025795     Chr10   Chr10-1   1.00000  8008
## 1259  AL026468     Chr14   Chr14-2   1.00000  8030
## 1260  AL030237     Chr05   Chr05-1   1.00000  8052
## 1261  AL030912     Chr02   Chr02-1   1.00000  8052
## 1262  AL028375     Chr14   Chr14-2   1.00000  8111
## 1263  AL030291     Chr10   Chr10-1   1.00000  8118
## 1264  AL030634     Chr10   Chr10-1   1.00000  8140
## 1265  AL026609     Chr10   Chr10-1   1.00000  8162
## 1266  AL027357     Chr11   Chr11-1   1.00000  8162
## 1267  AC030405     Chr10   Chr10-2   1.00000  8184
## 1268  AL030912     Chr11   Chr11-4   1.00000  8184
## 1269  AC030871     Chr07   Chr07-2   1.00000  8250
## 1270  AC030629     Chr03   Chr03-1   1.00000  8272
## 1271  AL024651     Chr05   Chr05-5   1.00000  8272
## 1272  AC028730     Chr10   Chr10-1   1.00000  8294
## 1273  AC033642     Chr02   Chr02-1   1.00000  8294
## 1274  AL033029     Chr05   Chr05-1   1.00000  8294
## 1275  AL023630     Chr11   Chr11-1   1.00000  8316
## 1276  AC035159     Chr02   Chr02-1   1.00000  8338
## 1277  AL023523     Chr01   Chr01-1   1.00000  8338
## 1278  AC028231     Chr03   Chr03-1   1.00000  8360
## 1279  AC036291     Chr07   Chr07-1   1.00000  8360
## 1280  AL023523     Chr14   Chr14-2   1.00000  8360
## 1281  AL024531     Chr11   Chr11-5   1.00000  8382
## 1282  AL033098     Chr02   Chr02-1   1.00000  8404
## 1283  AC035333     Chr07   Chr07-1   1.00000  8426
## 1284  AL024635     Chr14   Chr14-1   1.00000  8448
## 1285  AC028730     Chr02   Chr02-1   1.00000  8470
## 1286  AL030541     Chr14   Chr14-1   1.00000  8470
## 1287  AL024656     Chr03   Chr03-2   1.00000  8514
## 1288  AL030328     Chr10   Chr10-1   1.00000  8536
## 1289  AL031862     Chr05   Chr05-1   1.00000  8536
## 1290  AL033398     Chr02   Chr02-2   1.00000  8536
## 1291  AC034470     Chr08   Chr08-1   1.00000  8602
## 1292  AL030671     Chr05   Chr05-3   1.00000  8646
## 1293  AC032493     Chr03   Chr03-1   1.00000  8668
## 1294  AL023630     Chr14   Chr14-1   1.00000  8690
## 1295  AL033396     Chr03   Chr03-2   1.00000  8690
## 1296  AL029017     Chr03   Chr03-2   1.00000  8712
## 1297  AL024563     Chr07   Chr07-1   1.00000  8734
## 1298  AL024635     Chr07   Chr07-1   1.00000  8734
## 1299  AL024656     Chr01   Chr01-1   1.00000  8734
## 1300  AL026647     Chr03   Chr03-1   1.00000  8734
## 1301  AL027673     Chr05   Chr05-2   1.00000  8778
## 1302  AL027877     Chr03   Chr03-1   1.00000  8778
## 1303  AL031062     Chr10   Chr10-1   1.00000  8778
## 1304  AL033396     Chr08   Chr08-2   1.00000  8778
## 1305  AL023630     Chr09   Chr09-1   1.00000  8854
## 1306  AL024656     Chr11   Chr11-1   1.00000  8866
## 1307  AL027486     Chr08   Chr08-1   1.00000  8888
## 1308  AL026468     Chr07   Chr07-1   1.00000  8932
## 1309  AL031366     Chr10   Chr10-1   1.00000  8932
## 1310  AL024616     Chr10   Chr10-1   1.00000  8954
## 1311  AC035178     Chr03   Chr03-2   1.00000  8998
## 1312  AL026659     Chr03   Chr03-1   1.00000  9020
## 1313  AL032236     Chr07   Chr07-1   1.00000  9020
## 1314  AC033016     Chr10   Chr10-1   1.00000  9064
## 1315  AL026649     Chr08   Chr08-4   1.00000  9064
## 1316  AL030328     Chr03   Chr03-1   1.00000  9064
## 1317  AL032264     Chr02   Chr02-1   1.00000  9064
## 1318  AL024563     Chr14   Chr14-2   1.00000  9086
## 1319  AL028361     Chr05   Chr05-1   1.00000  9086
## 1320  AL024087     Chr09   Chr09-1   1.00000  9108
## 1321  AL025736     Chr05   Chr05-3   1.00000  9108
## 1322  AL026609     Chr03   Chr03-1   1.00000  9108
## 1323  AC025540     Chr05   Chr05-1   1.00000  9130
## 1324  AL025332     Chr07   Chr07-3   1.00000  9130
## 1325  AL026345     Chr07   Chr07-1   1.00000  9130
## 1326  AL028361     Chr01   Chr01-2   1.00000  9130
## 1327  AL031908     Chr02   Chr02-1   1.00000  9130
## 1328  AL033182     Chr03   Chr03-3   1.00000  9130
## 1329  AL026647     Chr10   Chr10-1   1.00000  9152
## 1330  AL028928     Chr11   Chr11-1   1.00000  9152
## 1331  AC034529     Chr03   Chr03-1   1.00000  9174
## 1332  AL033398     Chr03   Chr03-3   1.00000  9174
## 1333  AL032236     Chr09   Chr09-2   1.00000  9178
## 1334  AL029974     Chr14   Chr14-1   1.00000  9306
## 1335  AL025765     Chr08   Chr08-2   1.00000  9328
## 1336  AL030022     Chr03   Chr03-1   1.00000  9328
## 1337  AC035261     Chr14   Chr14-2   1.00000  9372
## 1338  AL023523     Chr08   Chr08-3   1.00000  9394
## 1339  AL026145     Chr10   Chr10-1   1.00000  9394
## 1340  AL027486     Chr05   Chr05-2   1.00000  9438
## 1341  AL028427     Chr05   Chr05-3   1.00000  9438
## 1342  AL033029     Chr14   Chr14-1   1.00000  9438
## 1343  AC034470     Chr03   Chr03-2   1.00000  9460
## 1344  AL027357     Chr09   Chr09-2   1.00000  9491
## 1345  AL025736     Chr14   Chr14-1   1.00000  9504
## 1346  AC035959     Chr02   Chr02-1   1.00000  9570
## 1347  AL027682     Chr14   Chr14-2   1.00000  9570
## 1348  AC030629     Chr10   Chr10-1   1.00000  9592
## 1349  AL024563     Chr03   Chr03-3   1.00000  9592
## 1350  AL027682     Chr11   Chr11-3   1.00000  9592
## 1351  AL032912     Chr07   Chr07-3   1.00000  9614
## 1352  AL030230     Chr05   Chr05-3   1.00000  9625
## 1353  AL024616     Chr07   Chr07-2   1.00000  9679
## 1354  AL027673     Chr03   Chr03-1   1.00000  9680
## 1355  AL028427     Chr03   Chr03-2   1.00000  9680
## 1356  AC028231     Chr05   Chr05-1   1.00000  9717
## 1357  AC035261     Chr05   Chr05-1   1.00000  9718
## 1358  AL024087     Chr08   Chr08-1   1.00000  9719
## 1359  AL023661     Chr10   Chr10-1   1.00000  9724
## 1360  AL024616     Chr03   Chr03-1   1.00000  9724
## 1361  AL032715     Chr07   Chr07-4   1.00000  9741
## 1362  AL025336     Chr14   Chr14-1   1.00000  9743
## 1363  AL027357     Chr03   Chr03-1   1.00000  9750
## 1364  AL028964     Chr07   Chr07-1   1.00000  9753
## 1365  AC028231     Chr02   Chr02-3   1.00000  9756
## 1366  AL028964     Chr03   Chr03-1   1.00000  9757
## 1367  AC033642     Chr05   Chr05-1   1.00000  9763
## 1368  AC032820     Chr08   Chr08-3   1.00000  9769
## 1369  AL033396     Chr11   Chr11-2   1.00000  9775
## 1370  AC035159     Chr05   Chr05-1   1.00000  9790
## 1371  AL029755     Chr14   Chr14-2   1.00000  9790
## 1372  AL032340     Chr07   Chr07-2   1.00000  9791
## 1373  AL025515     Chr07   Chr07-1   1.00000  9794
## 1374  AL031382     Chr03   Chr03-1   1.00000  9798
## 1375  AL026640     Chr03   Chr03-2   1.00000  9799
## 1376  AL033217     Chr02   Chr02-2   1.00000  9799
## 1377  AL030500     Chr07   Chr07-2   1.00000  9801
## 1378  AC025640     Chr03   Chr03-1   1.00000  9811
## 1379  AL033228     Chr02   Chr02-1   1.00000  9811
## 1380  AC028231     Chr11   Chr11-4   1.00000  9812
## 1381  AC029782     Chr05   Chr05-1   1.00000  9813
## 1382  AL025336     Chr07   Chr07-1   1.00000  9813
## 1383  AL023523     Chr07   Chr07-4   1.00000  9815
## 1384  AL028361     Chr11   Chr11-1   1.00000  9815
## 1385  AL023630     Chr05   Chr05-4   1.00000  9816
## 1386  AC030871     Chr03   Chr03-1   1.00000  9817
## 1387  AC035159     Chr07   Chr07-2   1.00000  9818
## 1388  AL026738     Chr07   Chr07-1   1.00000  9819
## 1389  AC028231     Chr14   Chr14-2   1.00000  9824
## 1390  AC035159     Chr03   Chr03-1   1.00000  9825
## 1391  AL026640     Chr07   Chr07-1   1.00000  9827
## 1392  AL030552     Chr14   Chr14-1   1.00000  9830
## 1393  AC028231     Chr10   Chr10-2   1.00000  9831
## 1394  AL027486     Chr02   Chr02-2   1.00000  9835
## 1395  AL027486     Chr03   Chr03-1   1.00000  9835
## 1396  AL030073     Chr07   Chr07-3   1.00000  9836
## 1397  AC028231     Chr08   Chr08-3   1.00000  9838
## 1398  AL023630     Chr08   Chr08-1   1.00000  9841
## 1399  AL029755     Chr07   Chr07-1   1.00000  9842
## 1400  AL025515     Chr10   Chr10-1   1.00000  9844
## 1401  AC035261     Chr10   Chr10-2   1.00000  9846
## 1402  AL033182     Chr02   Chr02-1   1.00000  9846
## 1403  AL025230     Chr03   Chr03-1   1.00000  9847
## 1404  AL026178     Chr14   Chr14-2   1.00000  9847
## 1405  AL026649     Chr03   Chr03-1   1.00000  9850
## 1406  AL028971     Chr11   Chr11-1   1.00000  9852
## 1407  AL031382     Chr07   Chr07-2   1.00000  9852
## 1408  AC029508     Chr03   Chr03-1   1.00000  9853
## 1409  AL024531     Chr07   Chr07-3   1.00000  9853
## 1410  AL032119     Chr07   Chr07-4   1.00000  9853
## 1411  AL029974     Chr07   Chr07-5   1.00000  9855
## 1412  AL025765     Chr05   Chr05-2   1.00000  9857
## 1413  AL028361     Chr08   Chr08-2   1.00000  9857
## 1414  AC035159     Chr08   Chr08-2   1.00000  9858
## 1415  AL030230     Chr03   Chr03-1   1.00000  9858
## 1416  AL033228     Chr07   Chr07-2   1.00000  9858
## 1417  AL033396     Chr02   Chr02-1   1.00000  9860
## 1418  AL026738     Chr14   Chr14-2   1.00000  9861
## 1419  AL029755     Chr03   Chr03-1   1.00000  9861
## 1420  AL030528     Chr07   Chr07-3   1.00000  9862
## 1421  AC025540     Chr10   Chr10-2   1.00000  9863
## 1422  AL026640     Chr14   Chr14-1   1.00000  9864
## 1423  AL027357     Chr07   Chr07-1   1.00000  9864
## 1424  AL027757     Chr07   Chr07-1   1.00000  9864
## 1425  AL024531     Chr08   Chr08-1   1.00000  9865
## 1426  AL032028     Chr07   Chr07-4   1.00000  9866
## 1427  AC036378     Chr03   Chr03-2   1.00000  9868
## 1428  AL030500     Chr14   Chr14-1   1.00000  9869
## 1429  AL030116     Chr14   Chr14-2   1.00000  9870
## 1430  AL029975     Chr07   Chr07-2   1.00000  9871
## 1431  AL033182     Chr10   Chr10-1   1.00000  9871
## 1432  AC025519     Chr08   Chr08-3   1.00000  9875
## 1433  AL030581     Chr10   Chr10-1   1.00000  9875
## 1434  AL027486     Chr14   Chr14-2   1.00000  9876
## 1435  AL024087     Chr14   Chr14-2   1.00000  9878
## 1436  AL030328     Chr14   Chr14-2   1.00000  9878
## 1437  AL028971     Chr05   Chr05-3   1.00000  9879
## 1438  AL028971     Chr07   Chr07-6   1.00000  9879
## 1439  AL026468     Chr03   Chr03-1   1.00000  9882
## 1440  AL032066     Chr07   Chr07-2   1.00000  9882
## 1441  AL024087     Chr07   Chr07-1   1.00000  9884
## 1442  AL024087     Chr03   Chr03-1   1.00000  9885
## 1443  AL026345     Chr14   Chr14-1   1.00000  9885
## 1444  AL025765     Chr01   Chr01-3   1.00000  9886
## 1445  AL033398     Chr07   Chr07-3   1.00000  9887
## 1446  AL026145     Chr02   Chr02-2   1.00000  9890
## 1447  AL026345     Chr03   Chr03-1   1.00000  9890
## 1448  AL026738     Chr03   Chr03-1   1.00000  9890
## 1449  AL027757     Chr14   Chr14-1   1.00000  9890
## 1450  AC027188     Chr08   Chr08-2   1.00000  9891
## 1451  AL029017     Chr14   Chr14-1   1.00000  9891
## 1452  AL031366     Chr07   Chr07-5   1.00000  9891
## 1453  AL024563     Chr08   Chr08-1   1.00000  9892
## 1454  AL025736     Chr03   Chr03-1   1.00000  9893
## 1455  AL030114     Chr07   Chr07-5   1.00000  9893
## 1456  AL028294     Chr02   Chr02-1   1.00000  9894
## 1457  AL024531     Chr03   Chr03-3   1.00000  9896
## 1458  AL028964     Chr08   Chr08-2   1.00000  9896
## 1459  AL028294     Chr03   Chr03-1   1.00000  9897
## 1460  AL028361     Chr03   Chr03-1   1.00000  9897
## 1461  AL030022     Chr07   Chr07-1   1.00000  9897
## 1462  AC025795     Chr03   Chr03-1   1.00000  9898
## 1463  AL027673     Chr07   Chr07-1   1.00000  9898
## 1464  AL030291     Chr14   Chr14-1   1.00000  9900
## 1465  AL033098     Chr07   Chr07-2   1.00000  9901
## 1466  AL028294     Chr10   Chr10-1   1.00000  9902
## 1467  AL030073     Chr03   Chr03-1   1.00000  9902
## 1468  AC035159     Chr10   Chr10-1   1.00000  9904
## 1469  AL025743     Chr03   Chr03-1   1.00000  9905
## 1470  AL028964     Chr14   Chr14-1   1.00000  9905
## 1471  AL027673     Chr08   Chr08-1   1.00000  9907
## 1472  AL030767     Chr07   Chr07-2   1.00000  9907
## 1473  AL032500     Chr07   Chr07-4   1.00000  9907
## 1474  AC033642     Chr08   Chr08-3   1.00000  9910
## 1475  AL030230     Chr10   Chr10-1   1.00000  9913
## 1476  AC025640     Chr08   Chr08-3   1.00000  9914
## 1477  AL030500     Chr10   Chr10-1   1.00000  9917
## 1478  AC025540     Chr07   Chr07-3   1.00000  9921
## 1479  AC025519     Chr03   Chr03-2   1.00000  9922
## 1480  AL030237     Chr14   Chr14-1   1.00000  9922
## 1481  AL027682     Chr07   Chr07-1   1.00000  9923
## 1482  AL033029     Chr07   Chr07-2   1.00000  9923
## 1483  AC032947     Chr03   Chr03-1   1.00000  9925
## 1484  AL025515     Chr14   Chr14-2   1.00000  9925
## 1485  AL032744     Chr07   Chr07-4   1.00000  9925
## 1486  AL025230     Chr14   Chr14-1   1.00000  9929
## 1487  AL026486     Chr03   Chr03-2   1.00000  9929
## 1488  AL028427     Chr07   Chr07-3   1.00000  9929
## 1489  AL031908     Chr07   Chr07-1   1.00000  9929
## 1490  AL033396     Chr07   Chr07-2   1.00000  9931
## 1491  AC027188     Chr02   Chr02-1   1.00000  9933
## 1492  AL024180     Chr07   Chr07-1   1.00000  9934
## 1493  AL028971     Chr14   Chr14-3   1.00000  9934
## 1494  AL030291     Chr03   Chr03-1   1.00000  9934
## 1495  AL031862     Chr07   Chr07-2   1.00000  9935
## 1496  AL027757     Chr03   Chr03-2   1.00000  9937
## 1497  AL030634     Chr07   Chr07-1   1.00000  9937
## 1498  AL032118     Chr07   Chr07-2   1.00000  9937
## 1499  AL032264     Chr07   Chr07-1   1.00000  9938
## 1500  AC028231     Chr13   Chr13-2   1.00000  9940
## 1501  AC036378     Chr07   Chr07-1   1.00000  9941
## 1502  AL025736     Chr02   Chr02-2   1.00000  9941
## 1503  AL027757     Chr11   Chr11-1   1.00000  9943
## 1504  AL028971     Chr03   Chr03-2   1.00000  9943
## 1505  AL030114     Chr03   Chr03-1   1.00000  9943
## 1506  AL029017     Chr10   Chr10-1   1.00000  9946
## 1507  AL028294     Chr07   Chr07-1   1.00000  9950
## 1508  AL025728     Chr07   Chr07-1   1.00000  9954
## 1509  AL023630     Chr03   Chr03-2   1.00000  9955
## 1510  AL025765     Chr10   Chr10-1   1.00000  9957
## 1511  AC030405     Chr07   Chr07-3   1.00000  9958
## 1512  AL028928     Chr14   Chr14-1   1.00000  9958
## 1513  AL028365     Chr14   Chr14-2   1.00000  9962
## 1514  AL028361     Chr07   Chr07-1   1.00000  9963
## 1515  AL033396     Chr10   Chr10-1   1.00000  9963
## 1516  AC028730     Chr03   Chr03-1   1.00000  9966
## 1517  AL028375     Chr03   Chr03-3   1.00000  9967
## 1518  AL033029     Chr02   Chr02-1   1.00000  9970
## 1519  AL033182     Chr07   Chr07-2   1.00000  9974
## 1520  AL028361     Chr02   Chr02-1   1.00000  9976
## 1521  AL030912     Chr07   Chr07-2   1.00000  9976
## 1522  AC035959     Chr03   Chr03-1   1.00000  9978
## 1523  AL026884     Chr07   Chr07-1   1.00000  9978
## 1524  AL023630     Chr02   Chr02-1   1.00000  9982
## 1525  AL031382     Chr10   Chr10-1   1.00000  9983
## 1526  AL030065     Chr03   Chr03-1   1.00000  9985
## 1527  AL026178     Chr02   Chr02-3   1.00000  9989
## 1528  AL023630     Chr07   Chr07-1   1.00000 10000
## 1529  AL025765     Chr02   Chr02-3   1.00000 10000
## 1530  AL027877     Chr14   Chr14-1   1.00000 10000

Final data for inference

analysis_data <- peru_recurrent %>%
  select(subject_id = patient_name, 
         sample_id, 
         community = com_y, 
         timepoint = day,
         visit_date = date,
         age_years = age, 
         sex, 
         episodes, 
         marker_id, 
         haplotype, 
         frequency,
         mean_moi,
         max_moi) %>% 
  # add extra epi info on episode number and time since last episode
  left_join(episode_summary %>% select(subject_id = patient_name, 
                                       sample_id, 
                                       episode_number,
                                       days_since_enrolment,
                                       days_since_last_episode),
            by = c("subject_id", "sample_id")) %>% 
  # ensure dates are date class
  mutate(visit_date = mdy(visit_date))

Population-level allele frequencies

test_df <- peru %>% 
  # filter data frame by marker
  filter(marker_id == "Chr05")

test_df %>% 
      mutate(haplotype = factor(haplotype)) %>% 
      select(sample_id, haplotype, frequency) %>% 
      pivot_wider(names_from = haplotype, 
                  values_from = frequency, 
                  values_fill = 0) %>% 
      pivot_longer(cols = -sample_id, 
                   names_to = "haplotype", 
                   values_to = "frequency") %>% 
      # Get population-level haplotype frequency, 
      # correcting for when within-individual sum is not equal 
      # to 1, as can happen when a minority clone is <2% 
      group_by(sample_id) %>%
      mutate(frequency = frequency / sum(frequency, na.rm = TRUE)) %>%
  
      # get population-level mean freq
      group_by(haplotype) %>% 
      summarise(poplevel_mean_freq = mean(frequency, na.rm = TRUE)) %>% 
      adorn_totals("row")
## Derive pop-level allele frequency - This is modified from Thomas/Jason script for our data

# Use data from the entire dataset
fs <- peru %>% 
  
  # split data frame by marker
  group_by(marker_id) %>% 
  group_split() %>% 
  
  # Derive a within-marker list of frequencies, by individual
  lapply(function(x) {
    x <- x %>% 
      # Build a within-individual frequency table that 
      # always includes every haplotype (even the ones absent)
      mutate(haplotype = factor(haplotype)) %>% 
      select(sample_id, haplotype, frequency) %>% 
      pivot_wider(names_from = haplotype, 
                  values_from = frequency, 
                  values_fill = 0) %>% 
      pivot_longer(cols = -sample_id, 
                   names_to = "haplotype", 
                   values_to = "frequency") %>% 
      # Get population-level haplotype frequency, 
      # correcting for when within-individual sum is not equal 
      # to 1, as can happen when a minority clone is <2%
      group_by(sample_id) %>% 
      mutate(frequency = frequency / sum(frequency, na.rm = TRUE)) %>% 
      group_by(haplotype) %>% 
      summarise(frequency_pop_mean = mean(frequency, na.rm = TRUE))
    
    return(deframe(x))
  }) %>% 
  setNames(nm = peru %>% group_by(marker_id) %>% group_keys() %>% pull(marker_id))

# Here we can also save as dataframe for easier printing and table-ready for paper
fs_df <- peru %>%

  # Group by marker_id and sample_id for further calculations
  group_by(marker_id, sample_id) %>%

  # Build a within-individual frequency table that always includes every haplotype (even the ones absent)
  mutate(haplotype = factor(haplotype)) %>%
  select(marker_id, sample_id, haplotype, frequency) %>%
  pivot_wider(names_from = haplotype, values_from = frequency, values_fill = list(frequency = 0)) %>%
  pivot_longer(cols = -c(marker_id, sample_id), names_to = "haplotype", values_to = "frequency") %>%

  # Get population-level haplotype frequency, correcting for when within-individual sum is not equal to 1
  group_by(marker_id, sample_id) %>%
  mutate(frequency = frequency / sum(frequency, na.rm = TRUE)) %>%
  group_by(marker_id, haplotype) %>%
  summarise(frequency_pop_mean = mean(frequency, na.rm = TRUE), .groups = 'drop') %>%

  # Ensure haplotypes are correctly associated with their marker_id - note that this works for us because , in future would have to make this flexible to allow for haplotype names that are not reliant on having marker_id
  filter(str_detect(haplotype, marker_id))

fs_df
## # A tibble: 49 × 3
##    marker_id haplotype frequency_pop_mean
##    <chr>     <chr>                  <dbl>
##  1 Chr01     Chr01-1              0.588  
##  2 Chr01     Chr01-2              0.383  
##  3 Chr01     Chr01-3              0.0296 
##  4 Chr02     Chr02-1              0.541  
##  5 Chr02     Chr02-2              0.307  
##  6 Chr02     Chr02-3              0.143  
##  7 Chr02     Chr02-4              0.00925
##  8 Chr03     Chr03-1              0.648  
##  9 Chr03     Chr03-2              0.199  
## 10 Chr03     Chr03-3              0.153  
## # ℹ 39 more rows

Pv3Rs

Example for one participant: M1A020B

# This has been modified from Thomas/Jason script 

## Pick an individual at random to run Pv3Rs
# indiv_name <- sample(unique(analysis_data$subject_id), size = 1)
indiv_name <- "M1A020B"

## Prepare the data
# 1- Subset haplotype data to specific individual and apply filters
indiv_haplotype_data <- analysis_data %>% 
  # Restrict to a single patient
  filter(subject_id == indiv_name) %>% 
  # Restrict to a subset of markers, if needed
  filter(marker_id %in% BENCHMARK_MARKERS) %>% 
  # Restrict to summed MOI below threshold
  group_by(subject_id, episode_number, marker_id) %>% 
  mutate(MOI_per_marker = sum(n())) %>% 
  group_by(subject_id, episode_number) %>% 
  mutate(MOI_per_episode = max(MOI_per_marker, na.rm = TRUE)) %>% 
  ungroup() %>% 
  mutate(marker_id = factor(marker_id, levels = BENCHMARK_MARKERS))

# 2- Calculate per-episode and per-participant MOI for PvR3S eligibility
indiv_MOI <- indiv_haplotype_data %>% 
  select(subject_id, episode_number, 
         marker_id, starts_with("MOI_")) %>% 
  distinct() %>% 
  group_by(subject_id, episode_number) %>% 
  # Get highest per-marker MOI only for each episode
  # (drop marker_id in case of ties with highest per-marker MOI)
  select(-marker_id) %>% 
  distinct() %>% 
  filter(MOI_per_marker == max(MOI_per_marker, na.rm = TRUE)) %>% 
  ungroup() %>% 
  mutate(MOI_summed = sum(MOI_per_episode, na.rm = TRUE))

Prepare test data

# Finish data preparation
  indiv_haplotype_data <- indiv_haplotype_data %>% 
    group_by(episode_number) %>% 
    group_split() %>% 
    lapply(function(x) {
      res <- x %>% 
        select(sample_id, episode_number, 
               marker_id, haplotype, frequency) %>% 
        # For sensitivity analysis, allow to include/drop allele 
        # based on their within-individual frequency
        filter(frequency >= WITHIN_INDIVIDUAL_ALLELE_FREQ_THR) %>% 
        select(-sample_id, -episode_number, -frequency) %>% 
        distinct() %>% 
        # Prevent dropping of markers that are not characterised 
        # by setting .drop to FALSE
        group_by(marker_id, .drop = FALSE) %>% 
        group_split() %>% 
        lapply(function(y) {
          unique(y$haplotype)
        })
      
      # Returned a list named with each episode, 
      # setting marker allele to NA in case none are observed
      return(lapply(setNames(res, BENCHMARK_MARKERS), 
                    function(y) {
                      if (length(y) == 0) return(NA) else return(y)
                    }))
    })
# Run Aimee's posterior estimation
indiv_posterior <- Pv3Rs::compute_posterior(y  = indiv_haplotype_data, 
                                            fs = fs[BENCHMARK_MARKERS])
## Number of valid relationship graphs (RGs) is 39
## =============================================================================|
## Computing log p(Y|RG) for 39 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
indiv_posterior
## $marg
##      C         L          I
## [1,] 0 0.9983208 0.00167925
## 
## $joint
##          C          L          I 
## 0.00000000 0.99832075 0.00167925

The joint posterior probability of reinfection is 99.8%, when we look at the genetic data, this is in line with the inferred probability of relapse.

peru_recurrent %>% 
  filter(patient_name == "M1A020B") %>% 
  ggplot(aes(x = haplotype, y = factor(date), fill = factor(haplotype))) +
  geom_tile() +
    facet_grid(~marker_id, scales = "free_x") +
    theme_bw() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

Run Pv3Rs one random individual

# This has been modified from Thomas/Jason script 

## Pick an individual at random to run Pv3Rs
indiv_name <- sample(unique(analysis_data$subject_id), size = 1)

## Prepare the data
# 1- Subset haplotype data to specific individual and apply filters
indiv_haplotype_data <- analysis_data %>% 
  # Restrict to a single patient
  filter(subject_id == indiv_name) %>% 
  # Restrict to a subset of markers, if needed
  filter(marker_id %in% BENCHMARK_MARKERS) %>% 
  # Restrict to summed MOI below threshold
  group_by(subject_id, episode_number, marker_id) %>% 
  mutate(MOI_per_marker = sum(n())) %>% 
  group_by(subject_id, episode_number) %>% 
  mutate(MOI_per_episode = max(MOI_per_marker, na.rm = TRUE)) %>% 
  ungroup() %>% 
  mutate(marker_id = factor(marker_id, levels = BENCHMARK_MARKERS))

# 2- Calculate per-episode and per-participant MOI for PvR3S eligibility
indiv_MOI <- indiv_haplotype_data %>% 
  select(subject_id, episode_number, 
         marker_id, starts_with("MOI_")) %>% 
  distinct() %>% 
  group_by(subject_id, episode_number) %>% 
  # Get highest per-marker MOI only for each episode
  # (drop marker_id in case of ties with highest per-marker MOI)
  select(-marker_id) %>% 
  distinct() %>% 
  filter(MOI_per_marker == max(MOI_per_marker, na.rm = TRUE)) %>% 
  ungroup() %>% 
  mutate(MOI_summed = sum(MOI_per_episode, na.rm = TRUE))

Now that the data has been subset, Pv3Rs::compute_posterior() will be called (only if the participant meets eligibility criteria as defined by the global variables set earlier in this report).

if (RUN_EXAMPLE & unique(indiv_MOI$MOI_summed) <= MAX_MOI_TO_INCLUDE) {
  # Verbose
  cat("Running Pv3Rs for: ", 
      indiv_name, 
      " (summed MOI = ", 
      unique(indiv_MOI$MOI_summed), 
      ").\n", 
      sep = "")
  
  # Finish data preparation
  indiv_haplotype_data <- indiv_haplotype_data %>% 
    group_by(episode_number) %>% 
    group_split() %>% 
    lapply(function(x) {
      res <- x %>% 
        select(sample_id, episode_number, 
               marker_id, haplotype, frequency) %>% 
        # For sensitivity analysis, allow to include/drop allele 
        # based on their within-individual frequency
        filter(frequency >= WITHIN_INDIVIDUAL_ALLELE_FREQ_THR) %>% 
        select(-sample_id, -episode_number, -frequency) %>% 
        distinct() %>% 
        # Prevent dropping of markers that are not characterised 
        # by setting .drop to FALSE
        group_by(marker_id, .drop = FALSE) %>% 
        group_split() %>% 
        lapply(function(y) {
          unique(y$haplotype)
        })
      
      # Returned a list named with each episode, 
      # setting marker allele to NA in case none are observed
      return(lapply(setNames(res, BENCHMARK_MARKERS), 
                    function(y) {
                      if (length(y) == 0) return(NA) else return(y)
                    }))
    })
  
  # Run Aimee's posterior estimation
  indiv_posterior <- Pv3Rs::compute_posterior(y  = indiv_haplotype_data, 
                                              fs = fs[BENCHMARK_MARKERS])
} else {
  # Verbose
  cat("NOT Running Pv3Rs for: ", 
      indiv_name, 
      " because either summed MOI exceeds threshold (observed = ", 
      unique(indiv_MOI$MOI_summed), 
      ", MAX_MOI_TO_INCLUDE = ", 
      MAX_MOI_TO_INCLUDE, 
      "), or RUN_EXAMPLE was set to FALSE.\n", 
      sep = "")
  
  # Return NULL
  indiv_posterior <- NULL
}

indiv_posterior
peru_recurrent %>% 
  filter(patient_name == indiv_name) %>% 
  ggplot(aes(x = haplotype, y = factor(date), fill = factor(haplotype))) +
  geom_tile() +
    facet_grid(~marker_id, scales = "free_x") +
    theme_bw() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

Run for all participants

# Start timer
t_start <- Sys.time()

# Initialize an empty list to store the results
indiv_posteriors <- list()

# Loop through each unique individual name
for (indiv_name in unique(analysis_data$subject_id)) {
  # Verbose
  cat("ID : ", indiv_name, "...\n", sep = "")
  
  ## Prepare the data
  # 1- Subset haplotype data to specific individual and apply filters
  indiv_haplotype_data <- analysis_data %>% 
    # Restrict to a single patient
    filter(subject_id == indiv_name) %>% 
    # Restrict to a subset of markers
    filter(marker_id %in% BENCHMARK_MARKERS) %>% 
    # Restrict to summed MOI below threshold
    group_by(subject_id, episode_number, marker_id) %>% 
    mutate(MOI_per_marker = sum(n())) %>% 
    group_by(subject_id, episode_number) %>% 
    mutate(MOI_per_episode = max(MOI_per_marker, na.rm = TRUE)) %>% 
    ungroup() %>% 
    mutate(marker_id = factor(marker_id, levels = BENCHMARK_MARKERS))
  
  # 2- Calculate per-episode and per-participant MOI for PvR3S eligibility
  indiv_MOI <- indiv_haplotype_data %>% 
    select(subject_id, episode_number, 
           marker_id, starts_with("MOI_")) %>% 
    distinct() %>% 
    group_by(subject_id, episode_number) %>% 
    # Get highest per-marker MOI only for each episode
    # (drop marker_id in case of ties with highest per-marker MOI)
    select(-marker_id) %>% 
    distinct() %>% 
    filter(MOI_per_marker == max(MOI_per_marker, na.rm = TRUE)) %>% 
    ungroup() %>% 
    mutate(MOI_summed = sum(MOI_per_episode, na.rm = TRUE))
  
  ## Run Pv3Rs only if MOI below threshold         
  if (unique(indiv_MOI$MOI_summed) <= MAX_MOI_TO_INCLUDE) {
    # Verbose
    cat("Running Pv3Rs for: ", 
        indiv_name, 
        " (summed MOI = ", 
        unique(indiv_MOI$MOI_summed), 
        ").\n", 
        sep = "")
    
    # Preserve rounds for naming the output list
    indiv_episode <- unique(indiv_haplotype_data$episode_number)
    
    # Finish data preparation
    indiv_haplotype_data <- indiv_haplotype_data %>% 
      group_by(episode_number) %>% 
      group_split() %>% 
      lapply(function(x) {
        res <- x %>% 
          select(sample_id, episode_number, 
                 marker_id, haplotype, frequency) %>% 
          # For sensitivity analysis, allow to include/drop allele 
          # based on their within-individual frequency
          filter(frequency >= WITHIN_INDIVIDUAL_ALLELE_FREQ_THR) %>% 
          select(-sample_id, -episode_number, -frequency) %>% 
          distinct() %>% 
          # Prevent dropping of markers that are not characterized 
          # by setting .drop to FALSE
          group_by(marker_id, .drop = FALSE) %>% 
          group_split() %>% 
          lapply(function(y) {
            unique(y$haplotype)
          })
        
        # Returned a list named with each episode, 
        # setting marker allele to NA in case none are observed
        return(lapply(setNames(res, BENCHMARK_MARKERS), 
                      function(y) {
                        if (length(y) == 0) return(NA) else return(y)
                      }))
      })
    
    # Run Aimee's posterior estimation
    indiv_posterior <- compute_posterior(y     = indiv_haplotype_data,
                                         fs    = fs[BENCHMARK_MARKERS], 
                                         prior = matrix(PRIOR_3RS, 
                                                        nrow     = length(indiv_haplotype_data), 
                                                        ncol     = length(PRIOR_3RS), 
                                                        byrow    = TRUE, 
                                                        dimnames = list(c(1:length(indiv_haplotype_data)), 
                                                                        names(PRIOR_3RS))))
    
  } else {
    # Verbose
    cat("NOT Running Pv3Rs for: ", 
        indiv_name, 
        " because summed MOI exceeds threshold (observed = ", 
        unique(indiv_MOI$MOI_summed), 
        ", MAX_MOI_TO_INCLUDE = ", 
        MAX_MOI_TO_INCLUDE, 
        ").\n", 
        sep = "")
    
    # Return NULL
    indiv_episode    <- unique(indiv_haplotype_data$episode_number)
    indiv_posterior <- NULL
  }
  
  # Append the results to the list
  indiv_posteriors[[indiv_name]] <- list("subject_id" = indiv_name, 
                                         "episode_number"       = indiv_episode, 
                                         "Pv3Rs"       = indiv_posterior)
}
## ID : M1A008D...
## Running Pv3Rs for: M1A008D (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 39
## =============================================================================|
## Computing log p(Y|RG) for 39 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1A083D...
## Running Pv3Rs for: M1A083D (summed MOI = 3).
## Number of valid relationship graphs (RGs) is 9
## =============================================================================|
## Computing log p(Y|RG) for 9 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1A007B...
## Running Pv3Rs for: M1A007B (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 39
## =============================================================================|
## Computing log p(Y|RG) for 39 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1A007F...
## Running Pv3Rs for: M1A007F (summed MOI = 2).
## Number of valid relationship graphs (RGs) is 3
## =============================================================================|
## Computing log p(Y|RG) for 3 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1B020F...
## Running Pv3Rs for: M1B020F (summed MOI = 3).
## Number of valid relationship graphs (RGs) is 9
## =============================================================================|
## Computing log p(Y|RG) for 9 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1B040B...
## Running Pv3Rs for: M1B040B (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 39
## =============================================================================|
## Computing log p(Y|RG) for 39 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1A085C...
## Running Pv3Rs for: M1A085C (summed MOI = 2).
## Number of valid relationship graphs (RGs) is 3
## =============================================================================|
## Computing log p(Y|RG) for 3 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1A161C...
## Running Pv3Rs for: M1A161C (summed MOI = 3).
## Number of valid relationship graphs (RGs) is 9
## =============================================================================|
## Computing log p(Y|RG) for 9 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1A082B...
## Running Pv3Rs for: M1A082B (summed MOI = 3).
## Number of valid relationship graphs (RGs) is 9
## =============================================================================|
## Computing log p(Y|RG) for 9 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1A020B...
## Running Pv3Rs for: M1A020B (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 39
## =============================================================================|
## Computing log p(Y|RG) for 39 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1B011B...
## Running Pv3Rs for: M1B011B (summed MOI = 3).
## Number of valid relationship graphs (RGs) is 9
## =============================================================================|
## Computing log p(Y|RG) for 9 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1A043E...
## Running Pv3Rs for: M1A043E (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 39
## =============================================================================|
## Computing log p(Y|RG) for 39 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D049D...
## Running Pv3Rs for: M1D049D (summed MOI = 6).
## Number of valid relationship graphs (RGs) is 1315
## =============================================================================|
## Computing log p(Y|RG) for 1315 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1C019D...
## Running Pv3Rs for: M1C019D (summed MOI = 3).
## Number of valid relationship graphs (RGs) is 9
## =============================================================================|
## Computing log p(Y|RG) for 9 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D042A...
## Running Pv3Rs for: M1D042A (summed MOI = 2).
## Number of valid relationship graphs (RGs) is 3
## =============================================================================|
## Computing log p(Y|RG) for 3 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1C081A...
## Running Pv3Rs for: M1C081A (summed MOI = 7).
## Number of valid relationship graphs (RGs) is 11088
## =============================================================================|
## Computing log p(Y|RG) for 11088 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1C002A...
## Running Pv3Rs for: M1C002A (summed MOI = 2).
## Number of valid relationship graphs (RGs) is 3
## =============================================================================|
## Computing log p(Y|RG) for 3 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1C061B...
## Running Pv3Rs for: M1C061B (summed MOI = 3).
## Number of valid relationship graphs (RGs) is 9
## =============================================================================|
## Computing log p(Y|RG) for 9 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D010A...
## Running Pv3Rs for: M1D010A (summed MOI = 2).
## Number of valid relationship graphs (RGs) is 3
## =============================================================================|
## Computing log p(Y|RG) for 3 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D024B...
## Running Pv3Rs for: M1D024B (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 30
## =============================================================================|
## Computing log p(Y|RG) for 30 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D026A...
## Running Pv3Rs for: M1D026A (summed MOI = 5).
## Number of valid relationship graphs (RGs) is 250
## =============================================================================|
## Computing log p(Y|RG) for 250 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1E044C...
## Running Pv3Rs for: M1E044C (summed MOI = 6).
## Number of valid relationship graphs (RGs) is 1565
## =============================================================================|
## Computing log p(Y|RG) for 1565 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D019A...
## Running Pv3Rs for: M1D019A (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 39
## =============================================================================|
## Computing log p(Y|RG) for 39 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1C007E...
## Running Pv3Rs for: M1C007E (summed MOI = 2).
## Number of valid relationship graphs (RGs) is 3
## =============================================================================|
## Computing log p(Y|RG) for 3 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D026D...
## Running Pv3Rs for: M1D026D (summed MOI = 6).
## Number of valid relationship graphs (RGs) is 1315
## =============================================================================|
## Computing log p(Y|RG) for 1315 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1E016A...
## Running Pv3Rs for: M1E016A (summed MOI = 3).
## Number of valid relationship graphs (RGs) is 9
## =============================================================================|
## Computing log p(Y|RG) for 9 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1E025B...
## Running Pv3Rs for: M1E025B (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 39
## =============================================================================|
## Computing log p(Y|RG) for 39 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D036C...
## Running Pv3Rs for: M1D036C (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 39
## =============================================================================|
## Computing log p(Y|RG) for 39 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D049A...
## Running Pv3Rs for: M1D049A (summed MOI = 3).
## Number of valid relationship graphs (RGs) is 9
## =============================================================================|
## Computing log p(Y|RG) for 9 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1E036B...
## Running Pv3Rs for: M1E036B (summed MOI = 5).
## Number of valid relationship graphs (RGs) is 250
## =============================================================================|
## Computing log p(Y|RG) for 250 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1E026C...
## Running Pv3Rs for: M1E026C (summed MOI = 2).
## Number of valid relationship graphs (RGs) is 3
## =============================================================================|
## Computing log p(Y|RG) for 3 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1E028C...
## Running Pv3Rs for: M1E028C (summed MOI = 2).
## Number of valid relationship graphs (RGs) is 3
## =============================================================================|
## Computing log p(Y|RG) for 3 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1C031G...
## Running Pv3Rs for: M1C031G (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 39
## =============================================================================|
## Computing log p(Y|RG) for 39 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1E042B...
## Running Pv3Rs for: M1E042B (summed MOI = 2).
## Number of valid relationship graphs (RGs) is 3
## =============================================================================|
## Computing log p(Y|RG) for 3 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1E022A...
## Running Pv3Rs for: M1E022A (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 39
## =============================================================================|
## Computing log p(Y|RG) for 39 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D038D...
## Running Pv3Rs for: M1D038D (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 30
## =============================================================================|
## Computing log p(Y|RG) for 30 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1C010B...
## Running Pv3Rs for: M1C010B (summed MOI = 4).
## Number of valid relationship graphs (RGs) is 30
## =============================================================================|
## Computing log p(Y|RG) for 30 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D036A...
## Running Pv3Rs for: M1D036A (summed MOI = 2).
## Number of valid relationship graphs (RGs) is 3
## =============================================================================|
## Computing log p(Y|RG) for 3 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1C090C...
## Running Pv3Rs for: M1C090C (summed MOI = 5).
## Number of valid relationship graphs (RGs) is 172
## =============================================================================|
## Computing log p(Y|RG) for 172 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
## ID : M1D006D...
## Running Pv3Rs for: M1D006D (summed MOI = 2).
## Number of valid relationship graphs (RGs) is 3
## =============================================================================|
## Computing log p(Y|RG) for 3 RGs
## =============================================================================|
## Finding log-likelihood of each vector of recurrent states
## =============================================================================|
# End timer
t_end <- Sys.time()
cat("Pv3Rs for the whole dataset took : ", as.numeric(difftime(time1 = t_end, 
                                                               time2 = t_start, 
                                                               units = "secs"))/60, " mins", "\n", sep = "")
## Pv3Rs for the whole dataset took : 0.2346241 mins
# Present the marginal data in a clearer format
indiv_posteriors_marginal <- do.call(rbind, 
                                     lapply(indiv_posteriors, function(x) {
                                       if (!is.null(x[["Pv3Rs"]])) {
                                         return(data.frame("subject_id"               = x[["subject_id"]], 
                                                           "episode_number"                     = x[["episode_number"]][-1], 
                                                           "Posterior_marginal_prob_C" = x[["Pv3Rs"]]$marg[, "C"], 
                                                           "Posterior_marginal_prob_L" = x[["Pv3Rs"]]$marg[, "L"], 
                                                           "Posterior_marginal_prob_I" = x[["Pv3Rs"]]$marg[, "I"]))
                                       } else {
                                         return(NULL)
                                       }
                                       
                                     }))
row.names(indiv_posteriors_marginal) <- 1:nrow(indiv_posteriors_marginal)

# Present the joint posterior estimates in a clearer format
indiv_posteriors_joint <- do.call(rbind, 
                                  lapply(indiv_posteriors, function(x) {
                                    if (!is.null(x[["Pv3Rs"]])) {
                                      joint_probs <- x[["Pv3Rs"]]$joint
                                      # Extract the state pairs and probabilities
                                      state_pairs <- names(joint_probs)
                                      prob_values <- as.numeric(joint_probs)
                                      
                                      # Create a data frame with subject_id, episode_number, and joint probabilities
                                      return(data.frame("subject_id"      = rep(x[["subject_id"]], length(state_pairs)), 
                                                        "episode_number"  = rep(x[["episode_number"]][-1], each = length(state_pairs)),
                                                        "state_pair"      = state_pairs, 
                                                        "joint_probability" = prob_values))
                                    } else {
                                      return(NULL)
                                    }
                                  }))
row.names(indiv_posteriors_joint) <- 1:nrow(indiv_posteriors_joint)

# Save Pv3Rs output because it's time consuming and 
# we don't want to re-run it every time.
save(list = c("RUN_EXAMPLE", "WITHIN_INDIVIDUAL_ALLELE_FREQ_THR", "BENCHMARK_MARKERS", "MAX_MOI_TO_INCLUDE", "PRIOR_3RS", 
              "analysis_data", "fs", 
              "indiv_posteriors", "indiv_posteriors_marginal", "indiv_posteriors_joint"), 
     file = paste0("./outputs/Pv3Rs_peru_posteriors_", 
                   strftime(Sys.time(), format = "%Y%m%d_%H%M%S"), 
                   ".RData"))

Explore the posterior

The marginal probabilities give us the probability of the three states for each recurrent episode. However, this does not consider the joint probability of different states when a person experienced more than one recurrent episode.

indiv_posteriors_marginal
##    subject_id episode_number Posterior_marginal_prob_C
## 1     M1A008D              2                 0.0000000
## 2     M1A083D              2                 0.0000000
## 3     M1A007B              2                 0.0000000
## 4     M1A007F              2                 0.3925671
## 5     M1B020F              2                 0.0000000
## 6     M1B040B              2                 0.0000000
## 7     M1A085C              2                 0.0000000
## 8     M1A161C              2                 0.0000000
## 9     M1A082B              2                 0.0000000
## 10    M1A020B              2                 0.0000000
## 11    M1B011B              2                 0.0000000
## 12    M1A043E              2                 0.0000000
## 13    M1D049D              2                 0.0000000
## 14    M1D049D              3                 0.0000000
## 15    M1C019D              2                 0.0000000
## 16    M1D042A              2                 0.0000000
## 17    M1C081A              2                 0.0000000
## 18    M1C081A              3                 0.0000000
## 19    M1C081A              4                 0.0000000
## 20    M1C002A              2                 0.0000000
## 21    M1C061B              2                 0.0000000
## 22    M1D010A              2                 0.0000000
## 23    M1D024B              2                 0.0000000
## 24    M1D026A              2                 0.0000000
## 25    M1D026A              3                 0.0000000
## 26    M1E044C              2                 0.0000000
## 27    M1E044C              3                 0.0000000
## 28    M1D019A              2                 0.0000000
## 29    M1C007E              2                 0.0000000
## 30    M1D026D              2                 0.0000000
## 31    M1D026D              3                 0.0000000
## 32    M1E016A              2                 0.0000000
## 33    M1E025B              2                 0.0000000
## 34    M1D036C              2                 0.0000000
## 35    M1D049A              2                 0.3050571
## 36    M1E036B              2                 0.3208016
## 37    M1E036B              3                 0.0000000
## 38    M1E026C              2                 0.3776514
## 39    M1E028C              2                 0.0000000
## 40    M1C031G              2                 0.0000000
## 41    M1E042B              2                 0.0000000
## 42    M1E022A              2                 0.0000000
## 43    M1D038D              2                 0.0000000
## 44    M1C010B              2                 0.0000000
## 45    M1D036A              2                 0.3846383
## 46    M1C090C              2                 0.0000000
## 47    M1D006D              2                 0.0000000
##    Posterior_marginal_prob_L Posterior_marginal_prob_I
## 1                 0.09349443              0.9065055681
## 2                 0.19037917              0.8096208306
## 3                 0.09303113              0.9069688689
## 4                 0.60719228              0.0002405764
## 5                 0.21863282              0.7813671776
## 6                 0.09304682              0.9069531828
## 7                 0.25947486              0.7405251391
## 8                 0.18211923              0.8178807686
## 9                 0.22280060              0.7771994031
## 10                0.99832075              0.0016792496
## 11                0.99848175              0.0015182461
## 12                0.99689703              0.0031029707
## 13                0.06188471              0.9381152932
## 14                0.55668424              0.4433157594
## 15                0.19383355              0.8061664541
## 16                0.25135792              0.7486420841
## 17                0.34132835              0.6586716540
## 18                0.34705495              0.6529450466
## 19                0.14937003              0.8506299712
## 20                0.68892955              0.3110704468
## 21                0.19107623              0.8089237659
## 22                0.28365892              0.7163410818
## 23                0.15492601              0.8450739850
## 24                0.18504804              0.8149519614
## 25                0.05134035              0.9486596501
## 26                0.09454487              0.9054551295
## 27                0.03554051              0.9644594850
## 28                0.16635935              0.8336406488
## 29                0.33769327              0.6623067329
## 30                0.27937051              0.7206294866
## 31                0.03841057              0.9615894348
## 32                0.20790984              0.7920901638
## 33                0.09322659              0.9067734120
## 34                0.09302329              0.9069767081
## 35                0.69142943              0.0035134297
## 36                0.67770238              0.0014959905
## 37                0.07543176              0.9245682361
## 38                0.61812147              0.0042271206
## 39                0.55039121              0.4496087949
## 40                0.09302326              0.9069767394
## 41                0.28093657              0.7190634262
## 42                0.09302326              0.9069767442
## 43                0.14477166              0.8552283441
## 44                0.14798465              0.8520153488
## 45                0.61520379              0.0001579491
## 46                0.36994567              0.6300543307
## 47                0.54277193              0.4572280717

The joint probabilites give us values for each possible combination of states, depending on the number of recurrent episodes experienced by the participant.

joint_summary <- indiv_posteriors_joint %>% 
                    group_by(subject_id, state_pair, joint_probability) %>% 
                    filter(episode_number == max(episode_number)) %>% 
                    mutate(percentage = round(joint_probability*100, 3),
                           total_recurrences = episode_number-1) %>%
                    select(-episode_number) %>% 
                    arrange(subject_id, total_recurrences, percentage) %>% 
                    relocate(total_recurrences, .before = state_pair)

joint_summary
## # A tibble: 174 × 5
## # Groups:   subject_id, state_pair, joint_probability [174]
##    subject_id total_recurrences state_pair joint_probability percentage
##    <chr>                  <dbl> <chr>                  <dbl>      <dbl>
##  1 M1A007B                    1 C                   0             0    
##  2 M1A007B                    1 L                   0.0930        9.30 
##  3 M1A007B                    1 I                   0.907        90.7  
##  4 M1A007F                    1 I                   0.000241      0.024
##  5 M1A007F                    1 C                   0.393        39.3  
##  6 M1A007F                    1 L                   0.607        60.7  
##  7 M1A008D                    1 C                   0             0    
##  8 M1A008D                    1 L                   0.0935        9.35 
##  9 M1A008D                    1 I                   0.907        90.7  
## 10 M1A020B                    1 C                   0             0    
## # ℹ 164 more rows

Plot marginal probabilities

marginal_summary <- indiv_posteriors_marginal %>% 
  pivot_longer(cols = !subject_id & !episode_number, 
               names_to = "posterior_type", 
               values_to = "posterior_value") %>% 
  mutate(posterior_classification = case_when(posterior_type == "Posterior_marginal_prob_C" ~ "Recrudescence",
                                              posterior_type == "Posterior_marginal_prob_L" ~ "Relapse",
                                              posterior_type == "Posterior_marginal_prob_I" ~ "Reinfection"),
         posterior_classification = factor(posterior_classification, 
                                           levels = c("Relapse", "Recrudescence", "Reinfection"))) %>% 
  select(-posterior_type)

marginal_summary
## # A tibble: 141 × 4
##    subject_id episode_number posterior_value posterior_classification
##    <chr>               <int>           <dbl> <fct>                   
##  1 M1A008D                 2          0      Recrudescence           
##  2 M1A008D                 2          0.0935 Relapse                 
##  3 M1A008D                 2          0.907  Reinfection             
##  4 M1A083D                 2          0      Recrudescence           
##  5 M1A083D                 2          0.190  Relapse                 
##  6 M1A083D                 2          0.810  Reinfection             
##  7 M1A007B                 2          0      Recrudescence           
##  8 M1A007B                 2          0.0930 Relapse                 
##  9 M1A007B                 2          0.907  Reinfection             
## 10 M1A007F                 2          0.393  Recrudescence           
## # ℹ 131 more rows

By episode number

marginal_summary %>% 
  group_by(subject_id) %>%
  arrange(desc(posterior_value), .by_group = TRUE) %>%
  mutate(subject_id = factor(subject_id, levels = unique(subject_id[order(posterior_value, decreasing = TRUE)]))) %>%
  
    ggplot(aes(x = factor(episode_number), y = posterior_value, group = episode_number, fill = posterior_classification)) + 
    geom_bar(stat = "identity", position = "fill") +
    scale_fill_manual(values = c("Relapse" = "turquoise3",
                                   "Recrudescence" = "skyblue4",
                                   "Reinfection" = "magenta3")) +
    
    scale_x_discrete(expand = c(0, 0)) +
    scale_y_continuous(expand = c(0, 0)) +
    
    labs(x     = "Episode number", 
         y     = "Posterior probability", 
         fill = "") + 
    theme_bw() +
    facet_wrap(~subject_id)

### By community

marginal_summary %>% 
  left_join(analysis_data %>% select(subject_id, community) %>% distinct(), 
            by = "subject_id") %>% 
  group_by(subject_id) %>% 
  arrange(desc(posterior_value), .by_group = TRUE) %>% 
  mutate(subject_id = factor(subject_id, levels = unique(subject_id[order(posterior_value, decreasing = TRUE)]))) %>% 
  ggplot(aes(x = factor(episode_number), y = posterior_value, group = episode_number, fill = posterior_classification)) + 
    geom_bar(stat = "identity", position = "fill") +
    scale_fill_manual(values = c("Relapse" = "turquoise3",
                                 "Recrudescence" = "skyblue4",
                                 "Reinfection" = "magenta3")) +
  
    scale_x_discrete(expand = c(0, 0)) +
    scale_y_continuous(expand = c(0, 0)) +
    labs(x     = "Episode number", 
         y     = "Posterior probability", 
         fill = "") + 
    theme_bw() +
    facet_wrap(community ~ subject_id)

### By days since first episode during study period

marginal_summary %>% 
  left_join(analysis_data %>% select(subject_id, episode_number, community, visit_date, days_since_enrolment, days_since_last_episode) %>% distinct(), 
            by = c("subject_id", "episode_number")) %>% 
  group_by(subject_id) %>%
  arrange(desc(posterior_value), .by_group = TRUE) %>%
  mutate(subject_id = factor(subject_id, levels = unique(subject_id[order(posterior_value, decreasing = TRUE)]))) %>%
  ggplot(aes(x = days_since_enrolment, y = posterior_value, group = episode_number, fill = posterior_classification)) + 
  geom_bar(stat = "identity", position = "fill", width = 10) +
    scale_fill_manual(values = c("Relapse" = "turquoise3",
                                 "Recrudescence" = "skyblue4",
                                 "Reinfection" = "magenta3")) +
  
    scale_x_continuous(expand = c(0, 0)) +
    scale_y_continuous(expand = c(0, 0)) +
  labs(x     = "Days since first episode", 
       y     = "Posterior probability", 
       fill = "") + 
  theme_bw() +
  facet_wrap(~subject_id)

## Plot joint probabilities

pal1 <- c(
  "C" = "turquoise3", 
  "I" = "magenta3", 
  "L" = "skyblue4")

pal2 <- c(
  "II" = "magenta3",
  "IL" = "darkorange2",
  "LI" = "goldenrod2",
  "LL" = "skyblue4",
  "CI" = "saddlebrown",
  "CL" = "turquoise4"
)

pal3 <- c(
  "LLL" = "skyblue4",
  "LIL" = "goldenrod3",
  "ILL" = "orangered3",
  "IIL" = "darkorange3",
  "LLI" = "orange3",
  "ILI" = "sienna4",
  "LII" = "peru",
  "III" = "magenta3"
)

combined_pal <- c(pal1, pal2, pal3)
plotJointProb <- function(data, recurrence_n, prob_threshold, color_palette, ...){
  data %>% 
    filter(total_recurrences == recurrence_n, joint_probability > prob_threshold) %>% 
    group_by(subject_id) %>% 
    mutate(state_pair = fct_reorder(state_pair, joint_probability)) %>%
    ungroup() %>% 
    ggplot(aes(x = joint_probability, 
               y = subject_id, 
               fill = state_pair)) +
      geom_bar(position = "stack", stat = "identity") +
      scale_x_continuous(expand = c(0, 0)) +
      scale_y_discrete(expand = c(0, 0)) +
      scale_fill_manual(values = color_palette) +
      labs(x = "Joint probability estimate",
           y = "Participant",
           fill = "Classification state") +
      theme_bw() + 
    facet_wrap(~total_recurrences, scales = "free_y")
}

By total number of recurrences

plot_joint1 <- plotJointProb(joint_summary, 1, 0, pal1) 
plot_joint2 <- plotJointProb(joint_summary, 2, 0, pal2) + guides(fill = guide_legend(ncol = 2)) 
plot_joint3 <- plotJointProb(joint_summary, 3, 0.001, pal3) + guides(fill = guide_legend(ncol = 3)) 

(plot_joint1 | plot_joint2) / (plot_joint3) +
  plot_annotation(subtitle = "I = Reinfection, L = Relapse, C = Recrudescence",
                  caption = expression(italic("For >2 recurrences, only probability estimates > 0.001 are shown"))) +
  plot_layout(heights = c(4, 0.5))

### By community and number of recurrences

joint_summary %>% 
    left_join(analysis_data %>% select(subject_id, community) %>% distinct(),
              by = "subject_id") %>% 
    filter(joint_probability > 0.001) %>% 
    group_by(subject_id) %>% 
    mutate(state_pair = fct_reorder(state_pair, joint_probability)) %>%
    ungroup() %>% 
    ggplot(aes(x = joint_probability, 
               y = reorder(subject_id, total_recurrences), 
               fill = state_pair)) +
      geom_bar(position = "stack", stat = "identity") +
      scale_x_continuous(expand = c(0, 0)) +
      scale_y_discrete(expand = c(0, 0)) +
      scale_fill_manual(values = combined_pal) +
      labs(x = "Joint probability estimate",
           y = "Participant",
           fill = "Classification state",
           subtitle = "I = Reinfection, L = Relapse, C = Recrudescence",
           caption = expression(italic("Color coding: if > 1 recurrence, blue shades denote combinations of relapse and recrudescence (L and C), shades of orange/browns denote \ncombos of reinfection and relapse (I and L) and green shades denote combos of reinfection with recrudescence (I and C)"))) +
      theme_bw() + 
      facet_wrap(community~total_recurrences, scales = "free") +
      # facet_wrap(total_recurrences~treatment_arm, scales = "free") +
      theme(plot.caption = element_text(hjust = 0, vjust = -2)) 

### ‘Confidence’ in highest joint probability estimate What is the joint probability estimate for the ‘highest ranking’ state pair classification? I.e. if >80% relatively high confidence? n=19

joint_summary %>% 
  filter(joint_probability > 0.001) %>% 
  group_by(subject_id) %>% 
  # get the highest prob for each subj and store ranking
  mutate(ranking = rank(-joint_probability, ties.method = "first")) %>% 
  arrange(subject_id, ranking) %>% 
  filter(ranking == 1) %>% 
  ggplot(aes(x = reorder(subject_id, -joint_probability),
             y = joint_probability,
             fill = factor(total_recurrences))) +
    geom_col() +
    geom_hline(yintercept = 0.8, color = "darkgray", linetype = "dashed") +
    labs(x = "Participant",
         y = "Joint probability estimate for highest 'ranking' state pair",
         fill = "Number of recurrent episodes",
         caption = expression(italic("Dashed line indicates an arbitrary threshold of 80%"))) +
    theme_bw() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

How many state pairs make up the arbitrary 80% threshold?

joint_summary %>% 
  filter(joint_probability > 0.001) %>% 
  group_by(subject_id) %>% 
  # Get the highest prob for each subject and store ranking
  mutate(ranking = rank(-joint_probability, ties.method = "first")) %>% 
  # reverse ranking order of ranking so we plot the highest rank at the bottom
  arrange(subject_id, desc(ranking)) %>%
  mutate(ranking = factor(ranking, levels = unique(ranking))) %>% 
  ggplot(aes(x = subject_id,
             y = joint_probability,
             fill = ranking)) +
    geom_bar(stat = "identity", position = "stack") +
    geom_hline(yintercept = 0.8, color = "darkgray", linetype = "dashed") +
    scale_fill_brewer(type = "qual", "Paired") + 
    # scale_fill_manual(values = colorRampPalette(brewer.pal(12, "Paired"))(14),
    #                   guide = guide_legend(reverse = T)) +
    scale_x_discrete(expand = c(0, 0)) +
    scale_y_continuous(expand = c(0, 0)) +
    labs(x = "Participant",
         y = "Joint probability estimate for state pair",
         fill = "Number of possible \nestimated state pairs",
         caption = expression(italic("Dashed line indicates an arbitrary threshold of 80%"))) +
    theme_bw() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
    facet_wrap(~total_recurrences, scales = "free_x")

Highest ranking classification by episode number

joint_top3_summary <- joint_summary %>% 
            select(-percentage) %>% 
            group_by(subject_id) %>% 
            # Get the highest prob for each subject and store ranking
            mutate(ranking = rank(-joint_probability, ties.method = "first")) %>% 
            arrange(subject_id, ranking) %>% 
            filter(ranking %in% c(1, 2, 3))

We will keep the ‘highest ranking’ joint probability estimate so we can compare the state classification for each episode with other metrics

joint_recurrence_summary <- joint_top3_summary %>% 
  select(-total_recurrences) %>% 
  filter(ranking == 1) %>% 
  mutate(state_pair_split = strsplit(state_pair, "")) %>%  # Split state_pair into individual letters
  unnest(state_pair_split) %>%  # Unnest to create a new row for each letter
  group_by(subject_id) %>%
  mutate(
    episode_number = row_number() + 1,  # Create episode number starting from n+1 to reflect number of recurrence
    joint_probability = joint_probability,  # Keep the same joint_probability for all episodes\
    state_classification = case_when(state_pair_split == "L" ~ "Relapse",
                                     state_pair_split == "C" ~ "Recrudescence",
                                     state_pair_split == "I" ~ "Reinfection")) %>%
  select(subject_id, episode_number, state_classification, joint_probability)
joint_recurrence_summary %>% 
  ggplot(aes(x = factor(episode_number), y = joint_probability, fill = state_classification)) +
    geom_col() +
    scale_fill_manual(values = c("Relapse" = "turquoise3",
                                 "Recrudescence" = "skyblue4",
                                 "Reinfection" = "magenta3")) +
    scale_x_discrete(expand = c(0, 0)) +
    scale_y_continuous(expand = c(0, 0)) +
    labs(x     = "Episode number", 
         y     = "Posterior joint probability", 
         fill = "") + 
    theme_bw() +
    facet_wrap(~subject_id)

Comparison marginal vs joint

posterior_summary <- marginal_summary %>% 
  rename("marginal_posterior_probability" = "posterior_value",
         "marginal_classification" = "posterior_classification") %>% 
  left_join(joint_recurrence_summary %>% 
               rename("joint_classification" = "state_classification",
                      "joint_posterior_probability" = "joint_probability"),
             by = c("subject_id", "episode_number")) %>% 
  pivot_longer(cols = c(marginal_posterior_probability, 
                        joint_posterior_probability, 
                        marginal_classification, 
                        joint_classification),
    names_to = c("estimate_type", ".value"),
    names_pattern = "(marginal|joint)_(posterior_probability|classification)") %>% 
  distinct() 
posterior_summary %>% 
  group_by(subject_id, episode_number) %>%
  arrange(desc(posterior_probability), .by_group = TRUE) %>%
  mutate(classification = factor(classification, levels = unique(classification))) %>%
  ungroup() %>% 
  ggplot(aes(x = factor(episode_number), y = posterior_probability, group = episode_number)) + 
    geom_bar(data = . %>% filter(estimate_type == "marginal"),
             aes(fill = classification),
             stat = "identity", 
             position = "fill") +
    geom_segment(data = . %>% filter(estimate_type == "joint"),
               aes(x = as.numeric(factor(episode_number)) - 0.4,  
                   xend = as.numeric(factor(episode_number)) + 0.4,  
                   y = posterior_probability,  
                   yend = posterior_probability, 
                   color = classification),
               size = 1.5) +
    geom_point(data = . %>% filter(estimate_type == "joint"),
               aes(color = classification,
                   fill = classification),
               shape = 21) +
    scale_fill_manual(values = c("Relapse" = "turquoise3",
                                 "Recrudescence" = "skyblue4",
                                 "Reinfection" = "magenta3")) +
    scale_color_manual(values = c("Relapse" = "#006064",
                                 "Recrudescence" = "#3B4F75",
                                 "Reinfection" = "#8B008B")) +
    scale_x_discrete(expand = c(0, 0)) +
    scale_y_continuous(expand = c(0, 0)) +
    labs(x     = "Episode number", 
         y     = "Posterior probability", 
         fill = "Marginal classification",
         color = "Joint probability estimate \n and classification") + 
    theme_bw() +
    facet_wrap(~subject_id)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Comparison to IBS and IBD estimates

peru_pnh <- read.csv(here("data/final", "peru_PNH_data.csv"))
ibd_r_data <- readRDS(here("data/final", "peru_all_meta.rds"))
ibd_rhat_data <- readRDS(here("data/final", "peru_sig_meta.rds"))

For direct comparison with the we can only look at the paired comparisons between baseline samples and ‘follow-up’ recurrent samples, but not other pw comparisons for a given participant.

peru_ibd <- ibd_r_data %>% 
              # filter to include only paired samples
              filter(comparison_type == "paired") %>% 
              # merge with analysis_data to get patient_name and 'day' info
              left_join(analysis_data %>% 
                          select(sample_id, subject_id, 
                                 day = days_since_enrolment) %>% 
                          distinct(),
                        by = c("sampleid1" = "sample_id")) %>% 
              rename("subject_id1" = "subject_id",
                     "day_id1" = "day") %>% 
              # do the same for sample id 2 in pair - merge with analysis_data to get patient_name and 'day' info
              left_join(analysis_data %>% 
                          select(sample_id, subject_id, 
                                 day = days_since_enrolment) %>% 
                          distinct(),
                        by = c("sampleid2" = "sample_id")) %>% 
              rename("day_id2" = "day") %>% 
              select(-subject_id1) %>% 
              # filter to include only pw comparisons to first episode in study period
              filter(day_id2 == "0") %>% 
              group_by(subject_id) %>%  
              arrange(date1) %>%  
              # create episode_number accounting for baseline as episode 1
              mutate(episode_number = row_number() + 1) %>% 
              ungroup()
classification_summary <- indiv_posteriors_marginal %>% 
  rename("posterior_probability_recrudescence" = "Posterior_marginal_prob_C",
         "posterior_probability_relapse" = "Posterior_marginal_prob_L",
         "posterior_probability_reinfection" = "Posterior_marginal_prob_I") %>% 
  # merge with epi variables
  left_join(analysis_data %>% select(subject_id, sample_id, episode_number, community, visit_date, days_since_enrolment, days_since_last_episode) %>% distinct(), 
            by = c("subject_id", "episode_number")) %>% 
  # merge with PNH data
  left_join(peru_pnh,
            by = c("subject_id" = "Patient", 
                   "episode_number" = "recurrence")) %>% 
  rename("prop_same_haps_1minusPNH" = "Prop_het", 
         "pnh_range" = "identity", 
         "classification" = "Classification") %>% 
  # create bins for 1-PNH (IBS metric)
  mutate(ibs_range = cut(prop_same_haps_1minusPNH,  
                         breaks = c(0, 0.25, 0.5, 0.75, 1), 
                         include.lowest = TRUE, 
                         labels = c("0-0.25", "0.25-0.5", "0.5-0.75", "0.75-1"))) %>% 
  # merge with IBD data
  left_join(peru_ibd,
            by = c("subject_id", "episode_number")) %>% 
  # create bins for IBD
  mutate(ibd_range = cut(estimate,  
                         breaks = c(0, 0.25, 0.5, 0.75, 1), 
                         include.lowest = TRUE, 
                         labels = c("0-0.25", "0.25-0.5", "0.5-0.75", "0.75-1"))) %>% 
  # merge with joint probabilities
  left_join(joint_recurrence_summary %>% 
              rename("joint_classification" = "state_classification"),
            by = c("subject_id", "episode_number"))

classification_summary
##    subject_id episode_number posterior_probability_recrudescence
## 1     M1A008D              2                           0.0000000
## 2     M1A083D              2                           0.0000000
## 3     M1A007B              2                           0.0000000
## 4     M1A007F              2                           0.3925671
## 5     M1B020F              2                           0.0000000
## 6     M1B040B              2                           0.0000000
## 7     M1A085C              2                           0.0000000
## 8     M1A161C              2                           0.0000000
## 9     M1A082B              2                           0.0000000
## 10    M1A020B              2                           0.0000000
## 11    M1B011B              2                           0.0000000
## 12    M1A043E              2                           0.0000000
## 13    M1D049D              2                           0.0000000
## 14    M1D049D              3                           0.0000000
## 15    M1C019D              2                           0.0000000
## 16    M1D042A              2                           0.0000000
## 17    M1C081A              2                           0.0000000
## 18    M1C081A              3                           0.0000000
## 19    M1C081A              4                           0.0000000
## 20    M1C002A              2                           0.0000000
## 21    M1C061B              2                           0.0000000
## 22    M1D010A              2                           0.0000000
## 23    M1D024B              2                           0.0000000
## 24    M1D026A              2                           0.0000000
## 25    M1D026A              3                           0.0000000
## 26    M1E044C              2                           0.0000000
## 27    M1E044C              3                           0.0000000
## 28    M1D019A              2                           0.0000000
## 29    M1C007E              2                           0.0000000
## 30    M1D026D              2                           0.0000000
## 31    M1D026D              3                           0.0000000
## 32    M1E016A              2                           0.0000000
## 33    M1E025B              2                           0.0000000
## 34    M1D036C              2                           0.0000000
## 35    M1D049A              2                           0.3050571
## 36    M1E036B              2                           0.3208016
## 37    M1E036B              3                           0.0000000
## 38    M1E026C              2                           0.3776514
## 39    M1E028C              2                           0.0000000
## 40    M1C031G              2                           0.0000000
## 41    M1E042B              2                           0.0000000
## 42    M1E022A              2                           0.0000000
## 43    M1D038D              2                           0.0000000
## 44    M1C010B              2                           0.0000000
## 45    M1D036A              2                           0.3846383
## 46    M1C090C              2                           0.0000000
## 47    M1D006D              2                           0.0000000
##    posterior_probability_relapse posterior_probability_reinfection sample_id
## 1                     0.09349443                      0.9065055681  AC032502
## 2                     0.19037917                      0.8096208306  AC030871
## 3                     0.09303113                      0.9069688689  AC032493
## 4                     0.60719228                      0.0002405764  AC032497
## 5                     0.21863282                      0.7813671776  AC036291
## 6                     0.09304682                      0.9069531828  AC035178
## 7                     0.25947486                      0.7405251391  AC035159
## 8                     0.18211923                      0.8178807686  AC031719
## 9                     0.22280060                      0.7771994031  AC035333
## 10                    0.99832075                      0.0016792496  AC033642
## 11                    0.99848175                      0.0015182461  AC034529
## 12                    0.99689703                      0.0031029707  AC034279
## 13                    0.06188471                      0.9381152932  AL025765
## 14                    0.55668424                      0.4433157594  AL028294
## 15                    0.19383355                      0.8061664541  AL030931
## 16                    0.25135792                      0.7486420841  AL030541
## 17                    0.34132835                      0.6586716540  AL031062
## 18                    0.34705495                      0.6529450466  AL031862
## 19                    0.14937003                      0.8506299712  AL032411
## 20                    0.68892955                      0.3110704468  AL026528
## 21                    0.19107623                      0.8089237659  AL030237
## 22                    0.28365892                      0.7163410818  AL026640
## 23                    0.15492601                      0.8450739850  AL032765
## 24                    0.18504804                      0.8149519614  AL026884
## 25                    0.05134035                      0.9486596501  AL031366
## 26                    0.09454487                      0.9054551295  AL028375
## 27                    0.03554051                      0.9644594850  AL030634
## 28                    0.16635935                      0.8336406488  AL027673
## 29                    0.33769327                      0.6623067329  AL030073
## 30                    0.27937051                      0.7206294866  AL026647
## 31                    0.03841057                      0.9615894348  AL032236
## 32                    0.20790984                      0.7920901638  AL030022
## 33                    0.09322659                      0.9067734120  AL032744
## 34                    0.09302329                      0.9069767081  AL032119
## 35                    0.69142943                      0.0035134297  AL027682
## 36                    0.67770238                      0.0014959905  AL028365
## 37                    0.07543176                      0.9245682361  AL030767
## 38                    0.61812147                      0.0042271206  AL028964
## 39                    0.55039121                      0.4496087949  AL032340
## 40                    0.09302326                      0.9069767394  AL033228
## 41                    0.28093657                      0.7190634262  AL030500
## 42                    0.09302326                      0.9069767442  AL032500
## 43                    0.14477166                      0.8552283441  AL033029
## 44                    0.14798465                      0.8520153488  AL032912
## 45                    0.61520379                      0.0001579491  AL032118
## 46                    0.36994567                      0.6300543307  AL033098
## 47                    0.54277193                      0.4572280717  AL033182
##    community visit_date days_since_enrolment days_since_last_episode   sample
## 1    Cahuide 2015-08-03                  244                     244 AC032502
## 2    Cahuide 2015-06-02                  182                     182 AC030871
## 3    Cahuide 2015-08-03                  243                     243 AC032493
## 4    Cahuide 2015-08-03                  182                     182 AC032497
## 5    Cahuide 2015-12-07                  279                     279 AC036291
## 6    Cahuide 2015-11-03                  236                     236 AC035178
## 7    Cahuide 2015-11-02                  178                     178 AC035159
## 8    Cahuide 2015-07-06                   53                      53 AC031719
## 9    Cahuide 2015-11-04                  149                     149 AC035333
## 10   Cahuide 2015-09-04                   28                      28 AC033642
## 11   Cahuide 2015-10-07                   58                      58 AC034529
## 12   Cahuide 2015-10-05                   34                      34 AC034279
## 13    Lupuna 2015-03-02                   87                      87 AL025765
## 14    Lupuna 2015-06-03                  180                      93 AL028294
## 15    Lupuna 2015-09-07                  244                     244 AL030931
## 16    Lupuna 2015-09-01                  232                     232 AL030541
## 17    Lupuna 2015-09-09                  240                     240 AL031062
## 18    Lupuna 2015-10-19                  280                      40 AL031862
## 19    Lupuna 2015-11-06                  298                      18 AL032411
## 20    Lupuna 2015-04-06                   83                      83 AL026528
## 21    Lupuna 2015-08-10                  209                     209 AL030237
## 22    Lupuna 2015-04-07                   83                      83 AL026640
## 23    Lupuna 2015-12-02                  322                     322 AL032765
## 24    Lupuna 2015-04-09                   65                      65 AL026884
## 25    Lupuna 2015-10-06                  245                     180 AL031366
## 26    Lupuna 2015-06-04                  119                     119 AL028375
## 27    Lupuna 2015-09-04                  211                      92 AL030634
## 28    Lupuna 2015-05-07                   90                      90 AL027673
## 29    Lupuna 2015-08-06                  177                     177 AL030073
## 30    Lupuna 2015-04-07                   31                      31 AL026647
## 31    Lupuna 2015-11-04                  242                     211 AL032236
## 32    Lupuna 2015-08-06                  122                     122 AL030022
## 33    Lupuna 2015-12-02                  239                     239 AL032744
## 34    Lupuna 2015-11-03                  210                     210 AL032119
## 35    Lupuna 2015-05-07                   30                      30 AL027682
## 36    Lupuna 2015-06-04                   57                      57 AL028365
## 37    Lupuna 2015-09-05                  150                      93 AL030767
## 38    Lupuna 2015-07-06                   63                      63 AL028964
## 39    Lupuna 2015-11-06                  178                     178 AL032340
## 40    Lupuna 2015-12-15                  194                     194 AL033228
## 41    Lupuna 2015-09-01                   57                      57 AL030500
## 42    Lupuna 2015-11-10                  126                     126 AL032500
## 43    Lupuna 2015-12-07                  153                     153 AL033029
## 44    Lupuna 2015-12-04                  116                     116 AL032912
## 45    Lupuna 2015-11-03                   57                      57 AL032118
## 46    Lupuna 2015-12-09                   93                      93 AL033098
## 47    Lupuna 2015-12-11                   15                      15 AL033182
##          date    treatment prop_same_haps_1minusPNH delay_since_prev_ep
## 1  2015-08-03 No treatment                0.5697270                 244
## 2  2015-06-02 No treatment                0.4233232                 182
## 3  2015-08-03 No treatment                0.2448705                 243
## 4  2015-08-03 No treatment                1.0000000                 182
## 5  2015-12-07 No treatment                0.5387873                 279
## 6  2015-11-03 No treatment                0.2181635                 236
## 7  2015-11-02 No treatment                0.1912069                 178
## 8  2015-07-06 No treatment                0.2070444                  53
## 9  2015-11-04 No treatment                0.4629275                 149
## 10 2015-09-04 No treatment                1.0000000                  28
## 11 2015-10-07 No treatment                1.0000000                  58
## 12 2015-10-05 No treatment                1.0000000                  34
## 13 2015-03-02 No treatment                0.4191986                  87
## 14 2015-06-03 No treatment                1.0000000                 180
## 15 2015-09-07 No treatment                0.5408380                 244
## 16 2015-09-01 No treatment                0.1166691                 232
## 17 2015-09-09 No treatment                0.6867761                 240
## 18 2015-10-19 No treatment                0.4999684                 280
## 19 2015-11-06 No treatment                0.4800970                 298
## 20 2015-04-06 No treatment                0.7524227                  83
## 21 2015-08-10 No treatment                0.4226612                 209
## 22 2015-04-07 No treatment                0.1819739                  83
## 23 2015-12-02 No treatment                0.4806984                 322
## 24 2015-04-09 No treatment                0.2190177                  65
## 25 2015-10-06 No treatment                0.3863808                 245
## 26 2015-06-04 No treatment                0.0000000                 119
## 27 2015-09-04 No treatment                0.3979616                 211
## 28 2015-05-07 No treatment                0.7902418                  90
## 29 2015-08-06 No treatment                0.4848159                 177
## 30 2015-04-07 No treatment                0.7154368                  31
## 31 2015-11-04 No treatment                0.4973695                 242
## 32 2015-08-06 No treatment                0.4893551                 122
## 33 2015-12-02 No treatment                0.4341896                 239
## 34 2015-11-03 No treatment                0.2948058                 210
## 35 2015-05-07 No treatment                1.0000000                  30
## 36 2015-06-04 No treatment                1.0000000                  57
## 37 2015-09-05 No treatment                0.2331090                 150
## 38 2015-07-06 No treatment                1.0000000                  63
## 39 2015-11-06 No treatment                0.6584768                 178
## 40 2015-12-15 No treatment                0.1301714                 194
## 41 2015-09-01 No treatment                0.3045193                  57
## 42 2015-11-10 No treatment                0.0000000                 126
## 43 2015-12-07 No treatment                0.2248418                 153
## 44 2015-12-04 No treatment                0.1401421                 116
## 45 2015-11-03 No treatment                1.0000000                  57
## 46 2015-12-09 No treatment                0.8922594                  93
## 47 2015-12-11 No treatment                0.3437509                  15
##    change_moi max_moi clones pnh_range classification .group ibs_range
## 1           0       2   poly  (0,0.75]     Homologous      3  0.5-0.75
## 2           1       2   poly  (0,0.75]     Homologous      7  0.25-0.5
## 3           0       2   poly  (0.75,1]   Heterologous      1    0-0.25
## 4           0       1   mono  (-Inf,0]     Homologous      2    0.75-1
## 5          -1       1   mono  (0,0.75]     Homologous     11  0.5-0.75
## 6           0       2   poly  (0.75,1]   Heterologous     12    0-0.25
## 7           0       1   mono  (0.75,1]   Heterologous      8    0-0.25
## 8           1       2   poly  (0.75,1]   Heterologous      9    0-0.25
## 9          -1       1   mono  (0,0.75]     Homologous      6  0.25-0.5
## 10          0       2   poly  (-Inf,0]     Homologous      4    0.75-1
## 11          1       2   poly  (-Inf,0]     Homologous     10    0.75-1
## 12          0       2   poly  (-Inf,0]     Homologous      5    0.75-1
## 13         -1       2   poly  (0,0.75]     Homologous     32  0.25-0.5
## 14         -1       1   mono  (-Inf,0]     Homologous     32    0.75-1
## 15          1       2   poly  (0,0.75]     Homologous     16  0.5-0.75
## 16          0       1   mono  (0.75,1]   Heterologous     30    0-0.25
## 17          2       3   poly  (0,0.75]     Homologous     19  0.5-0.75
## 18         -1       2   poly  (0,0.75]     Homologous     19  0.25-0.5
## 19         -1       1   mono  (0,0.75]     Homologous     19  0.25-0.5
## 20          0       1   mono  (0,0.75]     Homologous     13    0.75-1
## 21         -1       1   mono  (0,0.75]     Homologous     18  0.25-0.5
## 22          0       1   mono  (0.75,1]   Heterologous     22    0-0.25
## 23          2       3   poly  (0,0.75]     Homologous     24  0.25-0.5
## 24         -1       1   mono  (0.75,1]   Heterologous     25    0-0.25
## 25          1       2   poly  (0,0.75]     Homologous     25  0.25-0.5
## 26          0       2   poly  (0.75,1]   Heterologous     40    0-0.25
## 27          0       2   poly  (0,0.75]     Homologous     40  0.25-0.5
## 28          0       2   poly  (0,0.75]     Homologous     23    0.75-1
## 29          0       1   mono  (0,0.75]     Homologous     14  0.25-0.5
## 30         -2       1   mono  (0,0.75]     Homologous     26  0.5-0.75
## 31          1       2   poly  (0,0.75]     Homologous     26  0.25-0.5
## 32         -1       1   mono  (0,0.75]     Homologous     33  0.25-0.5
## 33          0       2   poly  (0,0.75]     Homologous     35  0.25-0.5
## 34          0       2   poly  (0,0.75]     Homologous     28  0.25-0.5
## 35         -1       1   mono  (-Inf,0]     Homologous     31    0.75-1
## 36         -1       1   mono  (-Inf,0]     Homologous     38    0.75-1
## 37          1       2   poly  (0.75,1]   Heterologous     38    0-0.25
## 38          0       1   mono  (-Inf,0]     Homologous     36    0.75-1
## 39          0       1   mono  (0,0.75]     Homologous     37  0.5-0.75
## 40          0       2   poly  (0.75,1]   Heterologous     17    0-0.25
## 41          0       1   mono  (0,0.75]     Homologous     39  0.25-0.5
## 42          0       2   poly  (0.75,1]   Heterologous     34    0-0.25
## 43         -2       1   mono  (0.75,1]   Heterologous     29    0-0.25
## 44          2       3   poly  (0.75,1]   Heterologous     15    0-0.25
## 45          0       1   mono  (-Inf,0]     Homologous     27    0.75-1
## 46          1       3   poly  (0,0.75]     Homologous     20    0.75-1
## 47          0       1   mono  (0,0.75]     Homologous     21  0.25-0.5
##    sampleid1 sampleid2 estimate      p_value CI_lower CI_upper patientid1
## 1   AC032502  AC025519    0.000 5.000000e-01    0.000    0.559      A008D
## 2   AC030871  AC025540    0.000 5.000000e-01    0.000    0.486      A083D
## 3   AC032493  AC025640    0.000 5.000000e-01    0.000    0.259      A007B
## 4   AC032497  AC027188    1.000 1.238651e-05    0.704    1.000      A007F
## 5   AC036291  AC028231    0.002 4.975801e-01    0.000    0.618      B020F
## 6   AC035178  AC028730    0.000 5.000000e-01    0.000    0.266      B040B
## 7   AC035159  AC030405    0.000 5.000000e-01    0.000    0.368      A085C
## 8   AC031719  AC030629    0.000 5.000000e-01    0.000    0.251        A6C
## 9   AC035333  AC031312    0.208 1.561044e-01    0.000    0.639      A082B
## 10  AC033642  AC032947    1.000 4.389883e-05    0.624    1.000      A020B
## 11  AC034529  AC033016    1.000 7.266956e-05    0.652    1.000        B0B
## 12  AC034279  AC033409    1.000 5.540812e-04    0.504    1.000      A043E
## 13  AL025765  AL023661    0.000 5.000000e-01    0.000    0.391      D049D
## 14  AL028294  AL023661    1.000 9.766689e-02    0.000    1.000      D049D
## 15  AL030931  AL024180    0.063 4.234904e-01    0.000    0.640       C09D
## 16  AL030541  AL024531    0.000 5.000000e-01    0.000    0.247      D042A
## 17  AL031062  AL024563    0.285 1.688367e-01    0.000    0.784       C08A
## 18  AL031862  AL024563    0.150 2.620348e-01    0.000    0.616       C08A
## 19  AL032411  AL024563    0.152 3.276786e-01    0.000    0.734       C08A
## 20  AL026528  AL024616    0.574 3.059022e-02    0.000    0.921      C002A
## 21  AL030237  AL024635    0.000 5.000000e-01    0.000    0.636       C06B
## 22  AL026640  AL024651    0.020 4.624243e-01    0.000    0.544       D00A
## 23  AL032765  AL024656    0.000 5.000000e-01    0.000    0.406      D024B
## 24  AL026884  AL025075    0.000 5.000000e-01    0.000    0.329      D026A
## 25  AL031366  AL025075    0.000 5.000000e-01    0.000    0.489      D026A
## 26  AL028375  AL025230    0.000 5.000000e-01    0.000    0.213      E044C
## 27  AL030634  AL025230    0.000 5.000000e-01    0.000    0.609      E044C
## 28  AL027673  AL025336    0.401 1.248052e-01    0.000    0.880       D09A
## 29  AL030073  AL025515    0.145 3.029587e-01    0.000    0.667      C007E
## 30  AL026647  AL026178    0.090 4.170238e-01    0.000    0.793      D026D
## 31  AL032236  AL026178    0.000 5.000000e-01    0.000    0.439      D026D
## 32  AL030022  AL026486    0.000 5.000000e-01    0.000    0.587       E06A
## 33  AL032744  AL026609    0.044 4.057350e-01    0.000    0.510      E025B
## 34  AL032119  AL026649    0.000 5.000000e-01    0.000    0.275      D036C
## 35  AL027682  AL026659    1.000 2.282026e-04    0.584    1.000      D049A
## 36  AL028365  AL026738    1.000 9.728660e-05    0.603    1.000      E036B
## 37  AL030767  AL026738    0.000 5.000000e-01    0.000    0.223      E036B
## 38  AL028964  AL027357    1.000 2.553009e-04    0.594    1.000      E026C
## 39  AL032340  AL027877    0.423 7.555122e-02    0.000    0.836      E028C
## 40  AL033228  AL028427    0.000 5.000000e-01    0.000    0.313       C03G
## 41  AL030500  AL028971    0.046 4.114015e-01    0.000    0.526      E042B
## 42  AL032500  AL029017    0.000 5.000000e-01    0.000    0.213      E022A
## 43  AL033029  AL029071    0.000 5.000000e-01    0.000    0.276      D038D
## 44  AL032912  AL030230    0.000 5.000000e-01    0.000    0.311       C00B
## 45  AL032118  AL030912    1.000 7.854532e-06    0.624    1.000      D036A
## 46  AL033098  AL030953    0.574 8.319682e-02    0.000    0.972      C090C
## 47  AL033182  AL032715    0.308 6.414419e-02    0.000    0.770      D006D
##    patientid2      date1      date2 comparison_type                pair
## 1       A008D 2015-08-03 2014-12-02          paired AC032502 / AC025519
## 2       A083D 2015-06-02 2014-12-02          paired AC030871 / AC025540
## 3       A007B 2015-08-03 2014-12-03          paired AC032493 / AC025640
## 4       A007F 2015-08-03 2015-02-02          paired AC032497 / AC027188
## 5       B020F 2015-12-07 2015-03-03          paired AC036291 / AC028231
## 6       B040B 2015-11-03 2015-03-12          paired AC035178 / AC028730
## 7       A085C 2015-11-02 2015-05-08          paired AC035159 / AC030405
## 8         A6C 2015-07-06 2015-05-14          paired AC031719 / AC030629
## 9       A082B 2015-11-04 2015-06-08          paired AC035333 / AC031312
## 10      A020B 2015-09-04 2015-08-07          paired AC033642 / AC032947
## 11        B0B 2015-10-07 2015-08-10          paired AC034529 / AC033016
## 12      A043E 2015-10-05 2015-09-01          paired AC034279 / AC033409
## 13      D049D 2015-03-02 2014-12-05          paired AL025765 / AL023661
## 14      D049D 2015-06-03 2014-12-05          paired AL028294 / AL023661
## 15       C09D 2015-09-07 2015-01-06          paired AL030931 / AL024180
## 16      D042A 2015-09-01 2015-01-12          paired AL030541 / AL024531
## 17       C08A 2015-09-09 2015-01-12          paired AL031062 / AL024563
## 18       C08A 2015-10-19 2015-01-12          paired AL031862 / AL024563
## 19       C08A 2015-11-06 2015-01-12          paired AL032411 / AL024563
## 20      C002A 2015-04-06 2015-01-13          paired AL026528 / AL024616
## 21       C06B 2015-08-10 2015-01-13          paired AL030237 / AL024635
## 22       D00A 2015-04-07 2015-01-14          paired AL026640 / AL024651
## 23      D024B 2015-12-02 2015-01-14          paired AL032765 / AL024656
## 24      D026A 2015-04-09 2015-02-03          paired AL026884 / AL025075
## 25      D026A 2015-10-06 2015-02-03          paired AL031366 / AL025075
## 26      E044C 2015-06-04 2015-02-05          paired AL028375 / AL025230
## 27      E044C 2015-09-04 2015-02-05          paired AL030634 / AL025230
## 28       D09A 2015-05-07 2015-02-06          paired AL027673 / AL025336
## 29      C007E 2015-08-06 2015-02-10          paired AL030073 / AL025515
## 30      D026D 2015-04-07 2015-03-07          paired AL026647 / AL026178
## 31      D026D 2015-11-04 2015-03-07          paired AL032236 / AL026178
## 32       E06A 2015-08-06 2015-04-06          paired AL030022 / AL026486
## 33      E025B 2015-12-02 2015-04-07          paired AL032744 / AL026609
## 34      D036C 2015-11-03 2015-04-07          paired AL032119 / AL026649
## 35      D049A 2015-05-07 2015-04-07          paired AL027682 / AL026659
## 36      E036B 2015-06-04 2015-04-08          paired AL028365 / AL026738
## 37      E036B 2015-09-05 2015-04-08          paired AL030767 / AL026738
## 38      E026C 2015-07-06 2015-05-04          paired AL028964 / AL027357
## 39      E028C 2015-11-06 2015-05-12          paired AL032340 / AL027877
## 40       C03G 2015-12-15 2015-06-04          paired AL033228 / AL028427
## 41      E042B 2015-09-01 2015-07-06          paired AL030500 / AL028971
## 42      E022A 2015-11-10 2015-07-07          paired AL032500 / AL029017
## 43      D038D 2015-12-07 2015-07-07          paired AL033029 / AL029071
## 44       C00B 2015-12-04 2015-08-10          paired AL032912 / AL030230
## 45      D036A 2015-11-03 2015-09-07          paired AL032118 / AL030912
## 46      C090C 2015-12-09 2015-09-07          paired AL033098 / AL030953
## 47      D006D 2015-12-11 2015-11-26          paired AL033182 / AL032715
##            sig_est day_id1 day_id2 ibd_range joint_classification
## 1  not significant     244       0    0-0.25          Reinfection
## 2  not significant     182       0    0-0.25          Reinfection
## 3  not significant     243       0    0-0.25          Reinfection
## 4      significant     182       0    0.75-1              Relapse
## 5  not significant     279       0    0-0.25          Reinfection
## 6  not significant     236       0    0-0.25          Reinfection
## 7  not significant     178       0    0-0.25          Reinfection
## 8  not significant      53       0    0-0.25          Reinfection
## 9  not significant     149       0    0-0.25          Reinfection
## 10     significant      28       0    0.75-1              Relapse
## 11     significant      58       0    0.75-1              Relapse
## 12     significant      34       0    0.75-1              Relapse
## 13 not significant      87       0    0-0.25          Reinfection
## 14 not significant     180       0    0.75-1              Relapse
## 15 not significant     244       0    0-0.25          Reinfection
## 16 not significant     232       0    0-0.25          Reinfection
## 17 not significant     240       0  0.25-0.5          Reinfection
## 18 not significant     280       0    0-0.25          Reinfection
## 19 not significant     298       0    0-0.25          Reinfection
## 20     significant      83       0  0.5-0.75              Relapse
## 21 not significant     209       0    0-0.25          Reinfection
## 22 not significant      83       0    0-0.25          Reinfection
## 23 not significant     322       0    0-0.25          Reinfection
## 24 not significant      65       0    0-0.25          Reinfection
## 25 not significant     245       0    0-0.25          Reinfection
## 26 not significant     119       0    0-0.25          Reinfection
## 27 not significant     211       0    0-0.25          Reinfection
## 28 not significant      90       0  0.25-0.5          Reinfection
## 29 not significant     177       0    0-0.25          Reinfection
## 30 not significant      31       0    0-0.25          Reinfection
## 31 not significant     242       0    0-0.25          Reinfection
## 32 not significant     122       0    0-0.25          Reinfection
## 33 not significant     239       0    0-0.25          Reinfection
## 34 not significant     210       0    0-0.25          Reinfection
## 35     significant      30       0    0.75-1              Relapse
## 36     significant      57       0    0.75-1              Relapse
## 37 not significant     150       0    0-0.25          Reinfection
## 38     significant      63       0    0.75-1              Relapse
## 39 not significant     178       0  0.25-0.5              Relapse
## 40 not significant     194       0    0-0.25          Reinfection
## 41 not significant      57       0    0-0.25          Reinfection
## 42 not significant     126       0    0-0.25          Reinfection
## 43 not significant     153       0    0-0.25          Reinfection
## 44 not significant     116       0    0-0.25          Reinfection
## 45     significant      57       0    0.75-1              Relapse
## 46 not significant      93       0  0.5-0.75          Reinfection
## 47 not significant      15       0  0.25-0.5              Relapse
##    joint_probability
## 1          0.9065056
## 2          0.8096208
## 3          0.9069689
## 4          0.6071923
## 5          0.7813672
## 6          0.9069532
## 7          0.7405251
## 8          0.8178808
## 9          0.7771994
## 10         0.9983208
## 11         0.9984818
## 12         0.9968970
## 13         0.5191654
## 14         0.5191654
## 15         0.8061665
## 16         0.7486421
## 17         0.3582473
## 18         0.3582473
## 19         0.3582473
## 20         0.6889296
## 21         0.8089238
## 22         0.7163411
## 23         0.8450740
## 24         0.7761753
## 25         0.7761753
## 26         0.8747423
## 27         0.8747423
## 28         0.8336406
## 29         0.6623067
## 30         0.6951545
## 31         0.6951545
## 32         0.7920902
## 33         0.9067734
## 34         0.9069767
## 35         0.6914294
## 36         0.6321839
## 37         0.6321839
## 38         0.6181215
## 39         0.5503912
## 40         0.9069767
## 41         0.7190634
## 42         0.9069767
## 43         0.8552283
## 44         0.8520153
## 45         0.6152038
## 46         0.6300543
## 47         0.5427719

Comparison with IBS

classification_summary %>% 
  select(subject_id, sample_id, episode_number, visit_date, days_since_enrolment, days_since_last_episode, starts_with("posterior_"), prop_same_haps_1minusPNH, pnh_range, ibs_range, classification) %>% 
  pivot_longer(cols = (starts_with("posterior")), 
               names_to = "posterior_type", 
               values_to = "posterior_value") %>% 
  mutate(posterior_range = cut(posterior_value, 
                               breaks = c(0, 0.25, 0.5, 0.75, 1), 
                               include.lowest = TRUE, 
                               labels = c("0-0.25", "0.25-0.5", "0.5-0.75", "0.75-1"))) %>% 
  count(ibs_range, classification, posterior_type, posterior_range)

Plot IBS range vs probabilistic classification (marginal probability)

classification_summary %>% 
  select(subject_id, sample_id, pair, episode_number, visit_date, days_since_enrolment, days_since_last_episode, starts_with("posterior_"), prop_same_haps_1minusPNH, pnh_range, ibs_range, classification) %>% 
  pivot_longer(cols = (starts_with("posterior")), 
               names_to = "posterior_type", 
               values_to = "posterior_value") %>% 
  mutate(posterior_range = cut(posterior_value, 
                               breaks = c(0, 0.25, 0.5, 0.75, 1), 
                               include.lowest = TRUE, 
                               labels = c("0-0.25", "0.25-0.5", "0.5-0.75", "0.75-1"))) %>%  
  ggplot(aes(x = reorder(pair, episode_number), y = posterior_value, group = episode_number, fill = posterior_type)) +
    geom_bar(stat = "identity", position = "fill") +
    scale_fill_manual(values = c("turquoise3", "magenta3", "skyblue4"),
                       labels = c("posterior_probability_relapse" = "Relapse",
                                  "posterior_probability_recrudescence" = "Recrudescence",
                                  "posterior_probability_reinfection" = "Reinfection")) +
    scale_x_discrete(expand = c(0, 0)) +
    scale_y_continuous(expand = c(0, 0)) +
    labs(x     = "Sample", 
         y     = "Posterior probability", 
         fill = "") + 
    theme_bw() +
    facet_wrap(~ibs_range, scales = "free_x") +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

### Plot IBS range vs probabilistic classification (joint probability, highest ranking)

classification_summary %>% 
  select(subject_id, sample_id, pair, episode_number, visit_date, days_since_enrolment, days_since_last_episode, starts_with("joint"), prop_same_haps_1minusPNH, pnh_range, ibs_range, classification) %>% 
  ggplot(aes(x = reorder(pair, episode_number), y = joint_probability, group = episode_number, fill = joint_classification)) +
    geom_bar(stat = "identity") +
    scale_fill_manual(values = c("Relapse" = "turquoise3",
                                 "Recrudescence" = "skyblue4",
                                 "Reinfection" = "magenta3")) +
    scale_x_discrete(expand = c(0, 0)) +
    scale_y_continuous(expand = c(0, 0)) +
    labs(x     = "Sample pair", 
         y     = "Posterior joint probability (highest ranking classification)", 
         fill = "") + 
    theme_bw() +
    facet_wrap(~ibs_range, scales = "free_x") +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

Comparison with IBD

classification_summary %>% 
  select(subject_id, sample_id, episode_number, visit_date, days_since_enrolment, days_since_last_episode, starts_with("posterior_"), ibd_range, CI_lower, CI_upper, sig_est) %>% 
  pivot_longer(cols = (starts_with("posterior")), 
               names_to = "posterior_type", 
               values_to = "posterior_value") %>% 
  mutate(posterior_range = cut(posterior_value, 
                               breaks = c(0, 0.25, 0.5, 0.75, 1), 
                               include.lowest = TRUE, 
                               labels = c("0-0.25", "0.25-0.5", "0.5-0.75", "0.75-1"))) %>% 
  count(ibd_range, sig_est, posterior_type, posterior_range)

For reference - all pairwise comparisons

ibd_r_data %>% 
  filter(comparison_type == "paired") %>% 
  ggplot(aes(x = pair, y = estimate, group = patientid1, color = sig_est)) +
    geom_point(size = 3) +
    geom_errorbar(aes(ymin = CI_lower, ymax = CI_upper)) +
    scale_color_manual(values = c("not significant" = "darkgrey", 
                                  "significant" = "indianred3")) +
    facet_wrap(~patientid1, scales = "free_x") +
    theme_bw() +    
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

Plot IBD estimate and CI for paired samples compared to baseline for each participant

classification_summary %>% 
  ggplot(aes(x = reorder(sampleid1, days_since_enrolment), y = estimate, group = subject_id, color = sig_est)) +
    geom_point(size = 3) +
    geom_errorbar(aes(ymin = CI_lower, ymax = CI_upper)) +
    scale_color_manual(values = c("not significant" = "darkgrey", 
                                  "significant" = "indianred3")) +
    labs(x = "Sample",
         y = "IBD",
         color = "Significance") +
    facet_wrap(~subject_id, scales = "free_x") +
    theme_bw() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

ibd_r_data %>% 
  filter(comparison_type == "not paired") %>% 
  ggplot(aes(x = pair, y = estimate, group = patientid1, color = sig_est)) +
    geom_point(size = 3) +
    geom_errorbar(aes(ymin = CI_lower, ymax = CI_upper)) +
    scale_color_manual(values = c("not significant" = "darkgrey", 
                                  "significant" = "indianred3")) +
    theme_bw() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

Plot IBD estimate and CI for paired samples compared to baseline for each participant, based on days since last episode

Perhaps reinfections are more likely to occur after more time?

classification_summary %>% 
  ggplot(aes(x = days_since_last_episode, y = estimate, group = subject_id, color = sig_est)) +
    geom_point(size = 3) +
    geom_errorbar(aes(ymin = CI_lower, ymax = CI_upper)) +
    scale_color_manual(values = c("not significant" = "darkgrey", 
                                  "significant" = "indianred3")) +
    labs(x = "Days since last episode",
         y = "IBD",
         fill = "Significance") +
    facet_wrap(~subject_id, scales = "free_x") +
    theme_bw() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

Plot IBD range vs probabilistic classification (marginal)

classification_summary %>% 
  select(subject_id, sample_id, pair, episode_number, visit_date, days_since_enrolment, days_since_last_episode, starts_with("posterior_"), ibd_range, CI_lower, CI_upper, sig_est) %>% 
  pivot_longer(cols = (starts_with("posterior")), 
               names_to = "posterior_type", 
               values_to = "posterior_value") %>% 
  mutate(posterior_range = cut(posterior_value, 
                               breaks = c(0, 0.25, 0.5, 0.75, 1), 
                               include.lowest = TRUE, 
                               labels = c("0-0.25", "0.25-0.5", "0.5-0.75", "0.75-1"))) %>%  
  ggplot(aes(x = reorder(pair, episode_number), y = posterior_value, group = episode_number, fill = posterior_type)) +
    geom_bar(stat = "identity", position = "fill") +
    scale_fill_manual(values = c("turquoise3", "magenta3", "skyblue4"),
                       labels = c("posterior_probability_relapse" = "Relapse",
                                  "posterior_probability_recrudescence" = "Recrudescence",
                                  "posterior_probability_reinfection" = "Reinfection")) +
    labs(x     = "Sample pair", 
         y     = "Posterior probability", 
         fill = "") + 
    theme_bw() +
    facet_wrap(~ibd_range, scales = "free_x") +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

Plot IBD range vs probabilistic classification (joint probability, highest ranking)

classification_summary %>% 
  select(subject_id, sample_id, pair, episode_number, visit_date, days_since_enrolment, days_since_last_episode, starts_with("joint"), ibd_range, CI_lower, CI_upper, sig_est) %>% 
  ggplot(aes(x = reorder(pair, episode_number), y = joint_probability, group = episode_number, fill = joint_classification)) +
    geom_bar(stat = "identity") +
    scale_fill_manual(values = c("Relapse" = "turquoise3",
                                 "Recrudescence" = "skyblue4",
                                 "Reinfection" = "magenta3")) +
    scale_x_discrete(expand = c(0, 0)) +
    scale_y_continuous(expand = c(0, 0)) +
    labs(x     = "Sample pair", 
         y     = "Posterior joint probability (highest ranking classification)", 
         fill = "") + 
    theme_bw() +
    facet_wrap(~ibd_range, scales = "free_x") +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

Confusion matrices: PNH vs probabilistic classification

Classification by 1-PNH (IBS) range

confusion_data_ibsrange <- classification_summary %>% 
  select(subject_id, sample_id, episode_number, visit_date, days_since_enrolment, days_since_last_episode, starts_with("posterior_"), starts_with("joint"), prop_same_haps_1minusPNH, pnh_range, ibs_range, 
         # renaming for clarity
         pnh_classification = classification) %>% 
  pivot_longer(cols = (starts_with("posterior")), 
               names_to = "marginal_classification", 
               values_to = "marginal_probability") %>% 
  mutate(marginal_classification = case_when(marginal_classification == "posterior_probability_recrudescence" ~ "Recrudescence",
                                             marginal_classification == "posterior_probability_relapse" ~ "Relapse",
                                             marginal_classification == "posterior_probability_reinfection" ~ "Reinfection"),
         marginal_classification = factor(marginal_classification, 
                                          levels = c("Relapse", "Recrudescence", "Reinfection")),
         marginal_probability_range = cut(marginal_probability, 
                                          breaks = c(0, 0.25, 0.5, 0.75, 1), 
                                          include.lowest = TRUE, 
                                          labels = c("0-0.25", "0.25-0.5", "0.5-0.75", "0.75-1")),
         joint_probability_range = cut(joint_probability, 
                                       breaks = c(0, 0.25, 0.5, 0.75, 1), 
                                       include.lowest = TRUE, 
                                       labels = c("0-0.25", "0.25-0.5", "0.5-0.75", "0.75-1"))) %>% 
  select(subject_id, episode_number, days_since_enrolment, ibs_range, pnh_classification,  marginal_classification, marginal_probability, marginal_probability_range, joint_classification, joint_probability, joint_probability_range) %>% 
  # now only keep the highest 'ranking' marginal classification
  group_by(subject_id, episode_number) %>% 
  slice_max(order_by = marginal_probability, n = 1, with_ties = F) %>% 
  ungroup() %>% 
  group_by(ibs_range, marginal_classification, joint_classification) %>%
  tally() %>%
  dcast(ibs_range ~ marginal_classification + joint_classification, value.var = "n", fill = 0)
confusion_data_ibsrange %>% 
  melt(id.vars = "ibs_range") %>% 
  ggplot(aes(ibs_range, variable, fill = value)) +
    geom_tile() +
    scale_fill_gradient(low = "white", high = "red") +
    geom_text(aes(label = value)) +
    theme_minimal() +
    labs(x = "IBS range (1-PNH)",
         y = "Marginal vs joint classification",
         fill = "Count")

Classification comparison

# Create a confusion matrix for each pair
confusion_data_pnhstate <- 
  classification_summary %>% 
  select(subject_id, sample_id, episode_number, visit_date, days_since_enrolment, days_since_last_episode, starts_with("posterior_"), starts_with("joint"), prop_same_haps_1minusPNH, pnh_range, ibs_range, 
         # renaming for clarity
         pnh_classification = classification) %>% 
  pivot_longer(cols = (starts_with("posterior")), 
               names_to = "marginal_classification", 
               values_to = "marginal_probability") %>% 
  mutate(marginal_classification = case_when(marginal_classification == "posterior_probability_recrudescence" ~ "Recrudescence",
                                             marginal_classification == "posterior_probability_relapse" ~ "Relapse",
                                             marginal_classification == "posterior_probability_reinfection" ~ "Reinfection"),
         marginal_classification = factor(marginal_classification, 
                                          levels = c("Relapse", "Recrudescence", "Reinfection")),
         marginal_probability_range = cut(marginal_probability, 
                                          breaks = c(0, 0.25, 0.5, 0.75, 1), 
                                          include.lowest = TRUE, 
                                          labels = c("0-0.25", "0.25-0.5", "0.5-0.75", "0.75-1")),
         joint_probability_range = cut(joint_probability, 
                                       breaks = c(0, 0.25, 0.5, 0.75, 1), 
                                       include.lowest = TRUE, 
                                       labels = c("0-0.25", "0.25-0.5", "0.5-0.75", "0.75-1")),
         # pnh_state = case_when(pnh_classification == "Heterologous" ~ "Reinfection",
         #                       pnh_classification == "Homologous" ~ "Relapse or Recrudescence")
         pnh_state = case_when(ibs_range == "0-0.25" | ibs_range == "0.25-0.5" ~ "Reinfection",
                               (ibs_range == "0.5-0.75" | ibs_range == "0.75-1") ~ "Relapse or Recrudescence")
         ) %>% 
  select(subject_id, episode_number, days_since_enrolment, ibs_range, pnh_classification, pnh_state, marginal_classification, marginal_probability, marginal_probability_range, joint_classification, joint_probability, joint_probability_range) %>% 
  # now only keep the highest 'ranking' marginal classification
  group_by(subject_id, episode_number) %>% 
  slice_max(order_by = marginal_probability, n = 1, with_ties = F) %>% 
  ungroup() %>% 
  group_by(pnh_state, marginal_classification, joint_classification) %>%
  tally() %>%
  dcast(pnh_state ~ marginal_classification + joint_classification, value.var = "n", fill = 0)
confusion_data_pnhstate %>% 
  melt(id.vars = "pnh_state") %>% 
  ggplot(aes(pnh_state, variable, fill = value)) +
    geom_tile() +
    scale_fill_gradient(low = "white", high = "red") +
    geom_text(aes(label = value)) +
    theme_minimal() +
    labs(x = "PNH classification",
         y = "Marginal vs joint classification",
         fill = "Count")

LS0tCnRpdGxlOiAiUnVubmluZyBQdjNScyBmb3IgUGVydSBkYXRhIgphdXRob3I6ICJTaGF6aWEgUnV5YmFsLVBlc8OhbnRleiIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlIAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgZmlnX3dpZHRoOiA4CiAgICBmaWdfaGVpZ2h0OiA2CiAgICB0aGVtZTogY29zbW8KLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShoZXJlKQpsaWJyYXJ5KHBhdGNod29yaykKbGlicmFyeShyZXNoYXBlMikKCiMgaW5zdGFsbC5wYWNrYWdlcygnUHYzUnMnLCByZXBvcyA9IGMoJ2h0dHBzOi8vcGxhc21vZ2VuZXBpLnItdW5pdmVyc2UuZGV2JywgJ2h0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZycpKQoKIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImFpbWVlcnRheWxvci9QdjNScyIpCiMgUHYzUnMgZG93bmxvYWRlZCBmcm9tIEdpdGh1YiBvbiA3IEF1ZyAyMDI0CmxpYnJhcnkoUHYzUnMpCmBgYAoKIyMgU2V0IGdsb2JhbCB2YXJpYWJsZXMKRnJvbSBUTy9KUyAtIFRoaXMgc2VjdGlvbiBzZXRzIHNvbWUgZmxhZ3MgdGhhdCBjYW4gYmUgdHdlYWtlZCB0byByZS1ydW4gdGhlIGFuYWx5c2lzIHdpdGggZGlmZmVyZW50IGZpbHRlcmluZyBwYXJhbWV0ZXJzOgoKYFJVTl9FWEFNUExFYDogYWxsb3dzIGRpc2NhcmRpbmcgYWxsZWxlcyB0aGF0IGhhdmUgYSBmcmVxdWVuY3kgYmVsb3cgYSB0aHJlc2hvbGQgKGRlZmF1bHRzIHRvIEZBTFNFKSwKYFdJVEhJTl9JTkRJVklEVUFMX0FMTEVMRV9GUkVRX1RIUmA6IGFsbG93cyBkaXNjYXJkaW5nIGFsbGVsZXMgdGhhdCBoYXZlIGEgZnJlcXVlbmN5IGJlbG93IGEgdGhyZXNob2xkIChkZWZhdWx0cyB0byAwKSwKYEJFTkNITUFSS19NQVJLRVJTYDogbGlzdCBvZiBtYXJrZXJzIHRvIGluY2x1ZGUgaW4gdGhlIGFuYWx5c2lzIChkZWZhdWx0cyB0byB0aGUgZnVsbCBsaXN0IGVzdGFibGlzaGVkIGJ5IEphc29uLCBjb3VsZCBiZSByZWR1Y2VkIGRvd24gdG8gMyBmb3IgbWVtb3J5IG9wdGltaXphdGlvbiksCmBNQVhfTU9JX1RPX0lOQ0xVREVgOiBhbGxvd3MgZGlzY2FyZGluZyBwYXJ0aWNpcGFudCBkYXRhIHdoZW4gdGhleSBleGhpYml0IHZlcnkgY29tcGxleCBpbmZlY3Rpb24gcGF0dGVybnMsIGNvdW50ZWQgYXMgdGhlIHRvdGFsIG51bWJlciBvZiBjbG9uZXMgYWNyb3NzIGFsbCBpbmZlY3Rpb24gZXZlbnRzIChkZWZhdWx0cyB0byA4KSwKYFBSSU9SXzNSU2A6IGEgbmFtZWQgdmVjdG9yIHdpdGggcHJpb3IgcHJvYmFiaWxpdGllcyBvZiByZWNydWRlc2NlbmNlIChDKSwgcmVsYXBzZSAoTCkgb3IgcmVpbmZlY3Rpb24gKEkpIChkZWZhdWx0cyB0byB1bmlmb3JtLCBpLmUuIDEvMyBlYWNoLCBidXQgdHdlYWtlZCB0byBtaW5pbWl6ZSByZWNydWRlc2NlbmNlIGluIHRoZSBwcmVzZW50IHN0dWR5KS4KCmBgYHtyIGdsb2JhbCB2YXJzfQojIyBSVU5fRVhBTVBMRQojIyAgIEJvb2xlYW4gZmxhZyB0byBlbmFibGUvZGlzYWJsZSBydW5uaW5nIHRoZSBleGFtcGxlIFB2M1JzIHBvc3RlcmlvciAKIyMgICBjb21wdXRhdGlvbiBvbiBhIHNpbmdsZSBlcGlzb2RlIHNhbXBsZWQgYXQgcmFuZG9tIGZyb20gdGhlIGRhdGFzZXQuCiMjIERFRkFVTFQ6IEZBTFNFClJVTl9FWEFNUExFIDwtIFRSVUUKCiMjIFdJVEhJTl9JTkRJVklEVUFMX0FMTEVMRV9GUkVRX1RIUgojIyAgIE1pbmltdW0gdGhyZXNob2xkIGFib3ZlIHdoaWNoIGFuIGFsbGVsZSBpcyBwcmVzZXJ2ZWQgaW4gaW5kaXZpZHVhbAojIyAgIGhhcGxvdHlwZSBkYXRhIHRvIGJlIHByZXNlcnZlZCB3aGVuIHJlY29uc3RydWN0aW5nIGluZmVjdGlvbiAKIyMgICBoaXN0b3J5LiBOb3RlIHRoYXQgdGhpcyB3aWxsICpub3QqIGRpc2NhcmQgdGhlc2UgYWxsZWxlcyBmcm9tIHRoZQojIyAgIHBvcHVsYXRpb24tbGV2ZWwgYWxsZWxlIGZyZXF1ZW5jeSB0aGF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgaW5pdGlhbAojIyAgIHZpc2l0LCBidXQgb25seSBkaXNjYXJkIHRoYXQgYWxsZWxlIGZyb20gaW5kaXZpZHVhbCBvYnNlcnZhdGlvbnMgCiMjICAgd2hlbiBpdCBpcyAndG9vIHJhcmUgdG8gYmUgZXhwbG9pdGVkJy4KIyMgREVGQVVMVDogMApXSVRISU5fSU5ESVZJRFVBTF9BTExFTEVfRlJFUV9USFIgPC0gMAoKIyMgQkVOQ0hNQVJLX01BUktFUlMKIyMgICBWZWN0b3Igb2YgY2hhcmFjdGVyIHN0cmluZyB3aXRoIG5hbWVzIG1hdGNoaW5nIHRob3NlIGZyb20gdGhlIAojIyAgIG1hcmtlcnMgb2YgaW50ZXJlc3QgZm9yIGFtcGxpY29uIHNlcXVlbmNpbmcuIE9ubHkgdGhlIG1hcmtlcnMgCiMjICAgbGlzdGVkIGluIHRoYXQgdmVjdG9yIHdpbGwgYmUgcHJlc2VydmVkIGluIGluZGl2aWR1YWwtbGV2ZWwgZGF0YQojIyAgIGFuZCBpZGVudGl0eSBvZiBpbmZlY3Rpb24gd2lsbCBiZSBzb2xlbHkgYmFzZWQgb24gdGhlIGFsbGVsZXMgCiMjICAgb2JzZXJ2ZWQgZm9yIHRoZXNlIG1hcmtlcnMuCiMjICAgVGhlIG1hcmtlcnMgYXJlIGxpc3RlZCBieSBpbXBvcnRhbmNlIGFzIGRpc2NvdmVyZWQgYnkgSmFzb24uCiMjIERFRkFVTFQ6IGFsbCBtYXJrZXJzIChjb3VsZCBiZSBzdWJvcHRpbWFsL3RvbyBtZW1vcnktY29uc3VtaW5nPykKQkVOQ0hNQVJLX01BUktFUlMgPC0gYygKICAiQ2hyMDUiLAogICJDaHIwNyIsIAogICJDaHIwOSIsIAogICJDaHIxMCIsCiAgIkNocjA4IiwKICAiQ2hyMTMiLAogICJDaHIxMSIsCiAgIkNocjAzIiwKICAiQ2hyMDEiLAogICJDaHIwMiIsCiAgIkNocjE0IgopCgojIyBNQVhfTU9JX1RPX0lOQ0xVREUKIyMgICBBcyBwZXIgQWltZWUncyBndWlkZWxpbmVzOiAKIyMgICAgIFdlIGRvIG5vdCByZWNvbW1lbmQgcnVubmluZyBjb21wdXRlX3Bvc3RlcmlvcigpIGZvciBkYXRhIAojIyAgICAgd2hvc2UgdG90YWwgZ2Vub3R5cGUgY291bnQgZXhjZWVkcyBlaWdodCwgd2hlcmUgdGhlIHRvdGFsIAojIyAgICAgZ2Vub3R5cGUgY291bnQgaXMgdGhlIHN1bSBvZiBwZXItZXBpc29kZSBtYXhpbXVtIHBlci1tYXJrZXIgCiMjICAgICBhbGxlbGUgY291bnRzLgojIyAgIFRoZSBNQVhfTU9JX1RPX0lOQ0xVREUgZXhwZWN0cyBhbiBpbnRlZ2VyIHRoYXQgd2lsbCBkaXNjYXJkIGFsbAojIyAgIGluZGl2aWR1YWxzIGhhdmluZyBhIHN1bW1lZCBNT0kgPiA4IGFjcm9zcyBhbGwgcmVjb3JkZWQgZXBpc29kZXMuCiMjIERFRkFVTFQ6IDgKTUFYX01PSV9UT19JTkNMVURFIDwtIDgKCiMjIFBSSU9SU18zUlMKIyMgICBBIHZlY3RvciBvZiBwcm9iYWJpbGl0aWVzLCBzdW1taW5nIHRvIDEsIGNvcnJlc3BvbmRpbmcgdG8gCiMjICAgdGhlIHByb2JhYmlsaXR5IG9mIGVhY2ggc3RhZ2UgZm9yIHRoZSAzUnMgZm9yIFB2IGVwaXNvZGVzLgojIyAgIFRoZSB2ZWN0b3Igb3JkZXIgaXMgcmUoQylydWRlc2NlbmNlLCByZShMKWFwc2UsIHJlKEkpbmZlY3Rpb24uCiMjICAgSW4gdGhpcyBjbGluaWNhbCB0cmlhbCwgd2UgYXNzdW1lIHJlY3J1ZGVzY2VuY2UgaXMgcG9zc2libGUgc28sIAojIyAgIHdlIHVzZSB0aGUgZGVmYXVsdCBwcmlvcnMgCiMjIERFRkFVTFQ6IGMoIkMiID0gMS8zLCAiTCIgPSAxLzMsICJJIiA9IDEvMykKIyBQUklPUl8zUlMgPC0gYygiQyIgPSAxLzMsICJMIiA9IDEvMywgIkkiID0gMS8zKQojIE5vdGU6IHRoZSBiZWxvdyBwcm9iYWJpbGl0aWVzIHdlcmUgdXNlZCBmb3IgU2Vyb1RBVCBzdHVkeSBiZWNhdXNlIGl0IGRvZXMgbm90IGludm9sdmUgdHJlYXRtZW50IGF0IGJhc2VsaW5lCiMgV2Ugd2lsbCB1c2UgdGhlIHNhbWUgZm9yIHRoZSBQZXJ1IGNvbW11bml0eSBzdXJ2ZXkKUFJJT1JfM1JTIDwtIGMoIkMiID0gMC4xMCwgIkwiID0gMC40NSwgIkkiID0gMC40NSkKYGBgCgojIyBQZXJ1IGRhdGEgY3VyYXRpb24KClJlYWQgaW4gZGF0YSBmcm9tIFBlcnU6CmBgYHtyIHJlYWQgcGVydSBkYXRhfQpwZXJ1IDwtIHJlYWQuY3N2KGhlcmUoImRhdGEvZmluYWwiLCAibWVyZ2VkX1BFLmNzdiIpKQoKIyBoZWFkKHBlcnUpCiMgbmFtZXMocGVydSkKYGBgCgojIyMgTnVtYmVyIG9mIHVuaXF1ZSBoYXBsb3R5cGVzIChpZSBtYXJrZXIgY2FyZGluYWxpdHkpOgpgYGB7ciBuIGhhcHN9CnBlcnUgJT4lIAogIGdyb3VwX2J5KG1hcmtlcl9pZCkgJT4lIAogIHN1bW1hcmlzZSh1bmlxdWVfaGFwbG90eXBlcyA9IG5fZGlzdGluY3QoaGFwbG90eXBlKSkKYGBgCgojIyMgQ291bnRzIG9mIGVhY2ggaGFwbG90eXBlOgpgYGB7ciBoYXAgY291bnRzfQpwZXJ1ICU+JSBjb3VudChtYXJrZXJfaWQsIGhhcGxvdHlwZSkKYGBgCgojIyMgIk1PSSI6CmBgYHtyIG1vaX0KcGVydSAlPiUgCiAgZ3JvdXBfYnkoUGF0aWVudE5hbWUsIG1hcmtlcl9pZCkgJT4lCiAgc3VtbWFyaXNlKG5faGFwbG90eXBlcyA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgZ3JvdXBfYnkoUGF0aWVudE5hbWUpICU+JSAKICBzdW1tYXJpc2UobWF4X21vaSA9IG1heChuX2hhcGxvdHlwZXMpKSAKYGBgCgojIyMgUmVjdXJyZW5jZXMKUGFydGljaXBhbnRzIHdpdGggbW9yZSB0aGFuIG9uZSBlcGlzb2RlIGZvciBpbmZlcmVuY2UgKG49NDAgcGFydGljaXBhbnRzLCBuPTg3IFB2IGlzb2xhdGVzKToKYGBge3IgcGFydGljaXBhbnQgd2l0aCByZWN1cnJlbmNlc30KcGVydSAlPiUgCiAgc2VsZWN0KFBhdGllbnROYW1lLCBlcGlzb2RlcykgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIGFycmFuZ2UoUGF0aWVudE5hbWUpICU+JSAKICBmaWx0ZXIoZXBpc29kZXM+MSkgCgppZHNfcmVjdXJyZW50IDwtIHBlcnUgJT4lIGNsZWFuX25hbWVzKCkgJT4lIGZpbHRlcihlcGlzb2RlcyA+IDEpICU+JSBkaXN0aW5jdChwYXRpZW50X25hbWUpCnBlcnVfcmVjdXJyZW50IDwtIHBlcnUgJT4lIGNsZWFuX25hbWVzKCkgJT4lIGZpbHRlcihlcGlzb2RlcyA+IDEpCgojIHNldGRpZmYoaWRzX3JlY3VycmVudCRwYXRpZW50X25hbWUsIHBlcnVfcmVjdXJyZW50JHBhdGllbnRfbmFtZSkKIyBzZXRkaWZmKHBlcnVfcmVjdXJyZW50JHBhdGllbnRfbmFtZSwgaWRzX3JlY3VycmVudCRwYXRpZW50X25hbWUpCgojIHBlcnVfcmVjdXJyZW50ICU+JSBkaXN0aW5jdChzYW1wbGVfaWQpICU+JSBhcnJhbmdlKHNhbXBsZV9pZCkgIyA4NyBpc29sYXRlcwpgYGAKCiMjIyBEYXRhIG9uIGVwaXNvZGUgbnVtYmVyIGFuZCB0aW1lIHNpbmNlIGxhc3QgZXBpc29kZQpgYGB7ciBlcGlzb2RlIHN1bW1hcnl9CmVwaXNvZGVfc3VtbWFyeSA8LSBwZXJ1X3JlY3VycmVudCAlPiUgCiAgZGlzdGluY3QocGF0aWVudF9uYW1lLCBkYXRlLCBzYW1wbGVfaWQsIGRheSkgJT4lIAogIG11dGF0ZShkYXRlID0gbWR5KGRhdGUpKSAlPiUKICBhcnJhbmdlKHBhdGllbnRfbmFtZSwgZGF0ZSkgJT4lIAogIGdyb3VwX2J5KHBhdGllbnRfbmFtZSkgJT4lIAogIG11dGF0ZSgKICAgICMgZ2V0IHRoZSBlcGlzb2RlIG51bWJlcgogICAgZXBpc29kZV9udW1iZXIgPSByb3dfbnVtYmVyKCksCiAgICAjIGNhbGN1bGF0ZSBkYXlzIHNpbmNlIGVucm9sbWVudCwganVzdCBhIGNoZWNrIHdpdGggZGF0ZXMKICAgIGRheXNfc2luY2VfZW5yb2xtZW50ID0gYXMuaW50ZWdlcihkYXRlIC0gbWluKGRhdGVbZGF5ID09ICJEYXkgMCJdKSksCiAgICAjIGNhbGN1bGF0ZSBkYXlzIHNpbmNlIGxhc3QgZXBpc29kZSB1c2luZyBsYWcoKSBhbmQgbWFraW5nIGVucm9sbWVudCBlcGlzb2RlcyAwIGRheXMgc2luY2UgbGFzdAogICAgZGF5c19zaW5jZV9sYXN0X2VwaXNvZGUgPSByZXBsYWNlX25hKGFzLmludGVnZXIoZGF0ZSAtIGxhZyhkYXRlKSksIDApCiAgKSAlPiUgCiAgdW5ncm91cCgpCmBgYAoKTm90ZSB0aGF0IGluIHRoZSBQZXJ1IHN0dWR5IHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGEgcGVyc29uJ3MgImZpcnN0IiBlcGlzb2RlLCByYXRoZXIgdGhlIGZpcnN0IGVwaXNvZGUgaW4gdGhlIGV2YWx1YXRlZCBzdHVkeSBwZXJpb2QKYGBge3IgcGxvdCByZWN1cnJlbmNlcywgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9OH0KZXBpc29kZV9zdW1tYXJ5ICU+JSAKICBkaXN0aW5jdChwYXRpZW50X25hbWUsIHNhbXBsZV9pZCwgZGF5c19zaW5jZV9lbnJvbG1lbnQpICU+JQogIGdncGxvdChhZXMoeCA9IGRheXNfc2luY2VfZW5yb2xtZW50LCB5ID0gcmVvcmRlcihwYXRpZW50X25hbWUsIGRheXNfc2luY2VfZW5yb2xtZW50KSkpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXAgPSBwYXRpZW50X25hbWUpLCBjb2xvciA9ICJkYXJrZ3JleSIpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBsYWJzKHggPSAiRGF5cyBzaW5jZSBmaXJzdCBlcGlzb2RlIGR1cmluZyBzdHVkeSBwZXJpb2QiLAogICAgICAgICB5ID0gIlBhcnRpY2lwYW50IikgKwogICAgdGhlbWVfYncoKSAKYGBgCgojIyBIYXBsb3R5cGUgZnJlcXVlbmNpZXMKV2Ugd2FudCB0byByZW1vdmUgYW55IGhhcGxvdHlwZXMgdGhhdCBhcHBlYXIgb25seSBvbmNlIGF0IHZlcnkgbG93IGZyZXF1ZW5jaWVzLiBIYXBsb3R5cGVzIHNob3VsZCBhbHJlYWR5IGJlIGZpbHRlcmVkIHRvIGJlIG9ic2VydmVkIGluIGF0IGxlYXN0IDIgc2FtcGxlcyBhbmQgd2l0aGluLWhvc3QgZnJlcXVlbmN5ID49MSUgKGluIGZ1bGwgZGF0YXNldCkuCgpgYGB7ciBzaW5nbGV0b24gaGFwcyBpbiByZWN1cnJlbnQgZGF0YXNldH0Kc2luZ2xldG9uX2hhcHMgPC0gcGVydV9yZWN1cnJlbnQgJT4lIAogIHNlbGVjdChzYW1wbGVfaWQsIG1hcmtlcl9pZCwgaGFwbG90eXBlLCBmcmVxdWVuY3ksIGNvdW50KSAlPiUgCiAgY291bnQoaGFwbG90eXBlKSAlPiUgCiAgYXJyYW5nZShuKSAlPiUgCiAgZmlsdGVyKG49PTEpICU+JSAKICBwdWxsKGhhcGxvdHlwZSkKCnBlcnVfcmVjdXJyZW50ICU+JSAKICBmaWx0ZXIoaGFwbG90eXBlICVpbiUgc2luZ2xldG9uX2hhcHMpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBoYXBsb3R5cGUsIHkgPSBjb3VudCkpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEwMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBmcmVxdWVuY3ksIHNoYXBlID0gZGF5KSwgc2l6ZSA9IDMpICsKICAgIGxhYnMoeCA9ICJzaW5nbGV0b24gaGFwbG90eXBlIiwKICAgICAgICAgeSA9ICJyZWFkIGNvdW50IiwKICAgICAgICAgY29sb3IgPSAid2l0aGluLXNhbXBsZSBmcmVxdWVuY3kiLAogICAgICAgICBzaGFwZSA9ICJ0aW1lcG9pbnQiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKQoKcGVydSAlPiUgCiAgZmlsdGVyKGhhcGxvdHlwZSAlaW4lIHNpbmdsZXRvbl9oYXBzKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gaGFwbG90eXBlLCB5ID0gY291bnQpKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxMDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZnJlcXVlbmN5LCBzaGFwZSA9IGRheSksIHNpemUgPSAzKSArCiAgICBsYWJzKHggPSAic2luZ2xldG9uIGhhcGxvdHlwZSIsCiAgICAgICAgIHkgPSAicmVhZCBjb3VudCIsCiAgICAgICAgIGNvbG9yID0gIndpdGhpbi1zYW1wbGUgZnJlcXVlbmN5IiwKICAgICAgICAgc2hhcGUgPSAidGltZXBvaW50IikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkKYGBgCiMjIEhhcGxvdHlwZXMgZm9yIGluZmVyZW5jZQpGb3IgUGVydSwgbW9zdCByZWN1cnJlbmNlcyB3b3VsZCBiZSBleHBlY3RlZCB0byBiZSBlaXRoZXIgcmVpbmZlY3Rpb25zIG9yIHJlbGFwc2VzLCBnaXZlbiB0aGF0IHRoaXMgc3R1ZHkgd2FzIGFuIG9ic2VydmF0aW9uYWwgY29tbXVuaXR5IGNvaG9ydCBpbiB0d28gc2l0ZXMgaW4gUGVydS4gQXMgcGVyIEFpbWVlJ3Mgc3VnZ2VzdGlvbiwgd2UgY2FuIGVzdGltYXRlIHBvcHVsYXRpb24tbGV2ZWwgYWxsZWxlIGZyZXF1ZW5jaWVzIGJhc2VkIG9uIGFsbCBlcGlzb2RlcyBpbiBvdXIgZGF0YXNldCAod2Ugd2lsbCB1c2UgdGhlIGVudGlyZSBkYXRhc2V0IChuPTkzIHBhcnRpY2lwYW50cyksIG5vdCBqdXN0IHRob3NlIHRoZSBzdWJzZXQgdGhhdCBleHBlcmllbmNlZCByZWN1cnJlbmNlcyAobj00MCkuIFRoaXMgc2hvdWxkIGJlIHVuYmlhc2VkIGFzIGJvdGggcmVpbmZlY3Rpb25zIGFuZCByZWxhcHNlcyBhcmUgZHJhd3MgZnJvbSB0aGUgbW9zcXVpdG8gcG9wdWxhdGlvbiAocmVsYXBzZXMgd291bGQgYmUgdGltZS1sYWdnZWQgZHJhd3MpIGluIHRoZSBhYnNlbmNlIG9mIGFueSBzeXN0ZW1hdGljIHdpdGhpbi1wYXRpZW50IHNlbGVjdGlvbiBvZiByZWNydWRlc2NlbnQgcGFyYXNpdGVzLgpgYGB7ciBoYXBzIGZvciBpbmZlcmVuY2V9CiMgbj0xNTMwIGhhcHMKYWxsX2hhcHMgPC0gcGVydSAlPiUgCiAgcHVsbChoYXBsb3R5cGUpCgpwZXJ1ICU+JQogIHNlbGVjdChzYW1wbGVfaWQsIG1hcmtlcl9pZCwgaGFwbG90eXBlLCBmcmVxdWVuY3ksIGNvdW50KSAlPiUKICBhcnJhbmdlKGZyZXF1ZW5jeSwgY291bnQpCmBgYAoKIyMgRmluYWwgZGF0YSBmb3IgaW5mZXJlbmNlCmBgYHtyIGZpbmFsIGFuYWx5c2lzIGRhdGF9CmFuYWx5c2lzX2RhdGEgPC0gcGVydV9yZWN1cnJlbnQgJT4lCiAgc2VsZWN0KHN1YmplY3RfaWQgPSBwYXRpZW50X25hbWUsIAogICAgICAgICBzYW1wbGVfaWQsIAogICAgICAgICBjb21tdW5pdHkgPSBjb21feSwgCiAgICAgICAgIHRpbWVwb2ludCA9IGRheSwKICAgICAgICAgdmlzaXRfZGF0ZSA9IGRhdGUsCiAgICAgICAgIGFnZV95ZWFycyA9IGFnZSwgCiAgICAgICAgIHNleCwgCiAgICAgICAgIGVwaXNvZGVzLCAKICAgICAgICAgbWFya2VyX2lkLCAKICAgICAgICAgaGFwbG90eXBlLCAKICAgICAgICAgZnJlcXVlbmN5LAogICAgICAgICBtZWFuX21vaSwKICAgICAgICAgbWF4X21vaSkgJT4lIAogICMgYWRkIGV4dHJhIGVwaSBpbmZvIG9uIGVwaXNvZGUgbnVtYmVyIGFuZCB0aW1lIHNpbmNlIGxhc3QgZXBpc29kZQogIGxlZnRfam9pbihlcGlzb2RlX3N1bW1hcnkgJT4lIHNlbGVjdChzdWJqZWN0X2lkID0gcGF0aWVudF9uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBpc29kZV9udW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheXNfc2luY2VfZW5yb2xtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlzX3NpbmNlX2xhc3RfZXBpc29kZSksCiAgICAgICAgICAgIGJ5ID0gYygic3ViamVjdF9pZCIsICJzYW1wbGVfaWQiKSkgJT4lIAogICMgZW5zdXJlIGRhdGVzIGFyZSBkYXRlIGNsYXNzCiAgbXV0YXRlKHZpc2l0X2RhdGUgPSBtZHkodmlzaXRfZGF0ZSkpCmBgYAoKIyMjIFBvcHVsYXRpb24tbGV2ZWwgYWxsZWxlIGZyZXF1ZW5jaWVzCmBgYHtyIHRlc3QgYWxsZWxlIGZyZXFzLCBldmFsPUZ9CnRlc3RfZGYgPC0gcGVydSAlPiUgCiAgIyBmaWx0ZXIgZGF0YSBmcmFtZSBieSBtYXJrZXIKICBmaWx0ZXIobWFya2VyX2lkID09ICJDaHIwNSIpCgp0ZXN0X2RmICU+JSAKICAgICAgbXV0YXRlKGhhcGxvdHlwZSA9IGZhY3RvcihoYXBsb3R5cGUpKSAlPiUgCiAgICAgIHNlbGVjdChzYW1wbGVfaWQsIGhhcGxvdHlwZSwgZnJlcXVlbmN5KSAlPiUgCiAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBoYXBsb3R5cGUsIAogICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGZyZXF1ZW5jeSwgCiAgICAgICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lIAogICAgICBwaXZvdF9sb25nZXIoY29scyA9IC1zYW1wbGVfaWQsIAogICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiaGFwbG90eXBlIiwgCiAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiZnJlcXVlbmN5IikgJT4lIAogICAgICAjIEdldCBwb3B1bGF0aW9uLWxldmVsIGhhcGxvdHlwZSBmcmVxdWVuY3ksIAogICAgICAjIGNvcnJlY3RpbmcgZm9yIHdoZW4gd2l0aGluLWluZGl2aWR1YWwgc3VtIGlzIG5vdCBlcXVhbCAKICAgICAgIyB0byAxLCBhcyBjYW4gaGFwcGVuIHdoZW4gYSBtaW5vcml0eSBjbG9uZSBpcyA8MiUgCiAgICAgIGdyb3VwX2J5KHNhbXBsZV9pZCkgJT4lCiAgICAgIG11dGF0ZShmcmVxdWVuY3kgPSBmcmVxdWVuY3kgLyBzdW0oZnJlcXVlbmN5LCBuYS5ybSA9IFRSVUUpKSAlPiUKICAKICAgICAgIyBnZXQgcG9wdWxhdGlvbi1sZXZlbCBtZWFuIGZyZXEKICAgICAgZ3JvdXBfYnkoaGFwbG90eXBlKSAlPiUgCiAgICAgIHN1bW1hcmlzZShwb3BsZXZlbF9tZWFuX2ZyZXEgPSBtZWFuKGZyZXF1ZW5jeSwgbmEucm0gPSBUUlVFKSkgJT4lIAogICAgICBhZG9ybl90b3RhbHMoInJvdyIpCmBgYAoKYGBge3IgcG9wIGxldmVsIGFsbGVsZSBmcmVxc30KIyMgRGVyaXZlIHBvcC1sZXZlbCBhbGxlbGUgZnJlcXVlbmN5IC0gVGhpcyBpcyBtb2RpZmllZCBmcm9tIFRob21hcy9KYXNvbiBzY3JpcHQgZm9yIG91ciBkYXRhCgojIFVzZSBkYXRhIGZyb20gdGhlIGVudGlyZSBkYXRhc2V0CmZzIDwtIHBlcnUgJT4lIAogIAogICMgc3BsaXQgZGF0YSBmcmFtZSBieSBtYXJrZXIKICBncm91cF9ieShtYXJrZXJfaWQpICU+JSAKICBncm91cF9zcGxpdCgpICU+JSAKICAKICAjIERlcml2ZSBhIHdpdGhpbi1tYXJrZXIgbGlzdCBvZiBmcmVxdWVuY2llcywgYnkgaW5kaXZpZHVhbAogIGxhcHBseShmdW5jdGlvbih4KSB7CiAgICB4IDwtIHggJT4lIAogICAgICAjIEJ1aWxkIGEgd2l0aGluLWluZGl2aWR1YWwgZnJlcXVlbmN5IHRhYmxlIHRoYXQgCiAgICAgICMgYWx3YXlzIGluY2x1ZGVzIGV2ZXJ5IGhhcGxvdHlwZSAoZXZlbiB0aGUgb25lcyBhYnNlbnQpCiAgICAgIG11dGF0ZShoYXBsb3R5cGUgPSBmYWN0b3IoaGFwbG90eXBlKSkgJT4lIAogICAgICBzZWxlY3Qoc2FtcGxlX2lkLCBoYXBsb3R5cGUsIGZyZXF1ZW5jeSkgJT4lIAogICAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaGFwbG90eXBlLCAKICAgICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBmcmVxdWVuY3ksIAogICAgICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IDApICU+JSAKICAgICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtc2FtcGxlX2lkLCAKICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImhhcGxvdHlwZSIsIAogICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImZyZXF1ZW5jeSIpICU+JSAKICAgICAgIyBHZXQgcG9wdWxhdGlvbi1sZXZlbCBoYXBsb3R5cGUgZnJlcXVlbmN5LCAKICAgICAgIyBjb3JyZWN0aW5nIGZvciB3aGVuIHdpdGhpbi1pbmRpdmlkdWFsIHN1bSBpcyBub3QgZXF1YWwgCiAgICAgICMgdG8gMSwgYXMgY2FuIGhhcHBlbiB3aGVuIGEgbWlub3JpdHkgY2xvbmUgaXMgPDIlCiAgICAgIGdyb3VwX2J5KHNhbXBsZV9pZCkgJT4lIAogICAgICBtdXRhdGUoZnJlcXVlbmN5ID0gZnJlcXVlbmN5IC8gc3VtKGZyZXF1ZW5jeSwgbmEucm0gPSBUUlVFKSkgJT4lIAogICAgICBncm91cF9ieShoYXBsb3R5cGUpICU+JSAKICAgICAgc3VtbWFyaXNlKGZyZXF1ZW5jeV9wb3BfbWVhbiA9IG1lYW4oZnJlcXVlbmN5LCBuYS5ybSA9IFRSVUUpKQogICAgCiAgICByZXR1cm4oZGVmcmFtZSh4KSkKICB9KSAlPiUgCiAgc2V0TmFtZXMobm0gPSBwZXJ1ICU+JSBncm91cF9ieShtYXJrZXJfaWQpICU+JSBncm91cF9rZXlzKCkgJT4lIHB1bGwobWFya2VyX2lkKSkKCiMgSGVyZSB3ZSBjYW4gYWxzbyBzYXZlIGFzIGRhdGFmcmFtZSBmb3IgZWFzaWVyIHByaW50aW5nIGFuZCB0YWJsZS1yZWFkeSBmb3IgcGFwZXIKZnNfZGYgPC0gcGVydSAlPiUKCiAgIyBHcm91cCBieSBtYXJrZXJfaWQgYW5kIHNhbXBsZV9pZCBmb3IgZnVydGhlciBjYWxjdWxhdGlvbnMKICBncm91cF9ieShtYXJrZXJfaWQsIHNhbXBsZV9pZCkgJT4lCgogICMgQnVpbGQgYSB3aXRoaW4taW5kaXZpZHVhbCBmcmVxdWVuY3kgdGFibGUgdGhhdCBhbHdheXMgaW5jbHVkZXMgZXZlcnkgaGFwbG90eXBlIChldmVuIHRoZSBvbmVzIGFic2VudCkKICBtdXRhdGUoaGFwbG90eXBlID0gZmFjdG9yKGhhcGxvdHlwZSkpICU+JQogIHNlbGVjdChtYXJrZXJfaWQsIHNhbXBsZV9pZCwgaGFwbG90eXBlLCBmcmVxdWVuY3kpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBoYXBsb3R5cGUsIHZhbHVlc19mcm9tID0gZnJlcXVlbmN5LCB2YWx1ZXNfZmlsbCA9IGxpc3QoZnJlcXVlbmN5ID0gMCkpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLWMobWFya2VyX2lkLCBzYW1wbGVfaWQpLCBuYW1lc190byA9ICJoYXBsb3R5cGUiLCB2YWx1ZXNfdG8gPSAiZnJlcXVlbmN5IikgJT4lCgogICMgR2V0IHBvcHVsYXRpb24tbGV2ZWwgaGFwbG90eXBlIGZyZXF1ZW5jeSwgY29ycmVjdGluZyBmb3Igd2hlbiB3aXRoaW4taW5kaXZpZHVhbCBzdW0gaXMgbm90IGVxdWFsIHRvIDEKICBncm91cF9ieShtYXJrZXJfaWQsIHNhbXBsZV9pZCkgJT4lCiAgbXV0YXRlKGZyZXF1ZW5jeSA9IGZyZXF1ZW5jeSAvIHN1bShmcmVxdWVuY3ksIG5hLnJtID0gVFJVRSkpICU+JQogIGdyb3VwX2J5KG1hcmtlcl9pZCwgaGFwbG90eXBlKSAlPiUKICBzdW1tYXJpc2UoZnJlcXVlbmN5X3BvcF9tZWFuID0gbWVhbihmcmVxdWVuY3ksIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAnZHJvcCcpICU+JQoKICAjIEVuc3VyZSBoYXBsb3R5cGVzIGFyZSBjb3JyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZWlyIG1hcmtlcl9pZCAtIG5vdGUgdGhhdCB0aGlzIHdvcmtzIGZvciB1cyBiZWNhdXNlICwgaW4gZnV0dXJlIHdvdWxkIGhhdmUgdG8gbWFrZSB0aGlzIGZsZXhpYmxlIHRvIGFsbG93IGZvciBoYXBsb3R5cGUgbmFtZXMgdGhhdCBhcmUgbm90IHJlbGlhbnQgb24gaGF2aW5nIG1hcmtlcl9pZAogIGZpbHRlcihzdHJfZGV0ZWN0KGhhcGxvdHlwZSwgbWFya2VyX2lkKSkKCmZzX2RmCmBgYAoKIyMgUHYzUnMKIyMjIEV4YW1wbGUgZm9yIG9uZSBwYXJ0aWNpcGFudDogTTFBMDIwQiAKYGBge3IgcHYzcnMgb25lIGV4YW1wbGV9CiMgVGhpcyBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIFRob21hcy9KYXNvbiBzY3JpcHQgCgojIyBQaWNrIGFuIGluZGl2aWR1YWwgYXQgcmFuZG9tIHRvIHJ1biBQdjNScwojIGluZGl2X25hbWUgPC0gc2FtcGxlKHVuaXF1ZShhbmFseXNpc19kYXRhJHN1YmplY3RfaWQpLCBzaXplID0gMSkKaW5kaXZfbmFtZSA8LSAiTTFBMDIwQiIKCiMjIFByZXBhcmUgdGhlIGRhdGEKIyAxLSBTdWJzZXQgaGFwbG90eXBlIGRhdGEgdG8gc3BlY2lmaWMgaW5kaXZpZHVhbCBhbmQgYXBwbHkgZmlsdGVycwppbmRpdl9oYXBsb3R5cGVfZGF0YSA8LSBhbmFseXNpc19kYXRhICU+JSAKICAjIFJlc3RyaWN0IHRvIGEgc2luZ2xlIHBhdGllbnQKICBmaWx0ZXIoc3ViamVjdF9pZCA9PSBpbmRpdl9uYW1lKSAlPiUgCiAgIyBSZXN0cmljdCB0byBhIHN1YnNldCBvZiBtYXJrZXJzLCBpZiBuZWVkZWQKICBmaWx0ZXIobWFya2VyX2lkICVpbiUgQkVOQ0hNQVJLX01BUktFUlMpICU+JSAKICAjIFJlc3RyaWN0IHRvIHN1bW1lZCBNT0kgYmVsb3cgdGhyZXNob2xkCiAgZ3JvdXBfYnkoc3ViamVjdF9pZCwgZXBpc29kZV9udW1iZXIsIG1hcmtlcl9pZCkgJT4lIAogIG11dGF0ZShNT0lfcGVyX21hcmtlciA9IHN1bShuKCkpKSAlPiUgCiAgZ3JvdXBfYnkoc3ViamVjdF9pZCwgZXBpc29kZV9udW1iZXIpICU+JSAKICBtdXRhdGUoTU9JX3Blcl9lcGlzb2RlID0gbWF4KE1PSV9wZXJfbWFya2VyLCBuYS5ybSA9IFRSVUUpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUobWFya2VyX2lkID0gZmFjdG9yKG1hcmtlcl9pZCwgbGV2ZWxzID0gQkVOQ0hNQVJLX01BUktFUlMpKQoKIyAyLSBDYWxjdWxhdGUgcGVyLWVwaXNvZGUgYW5kIHBlci1wYXJ0aWNpcGFudCBNT0kgZm9yIFB2UjNTIGVsaWdpYmlsaXR5CmluZGl2X01PSSA8LSBpbmRpdl9oYXBsb3R5cGVfZGF0YSAlPiUgCiAgc2VsZWN0KHN1YmplY3RfaWQsIGVwaXNvZGVfbnVtYmVyLCAKICAgICAgICAgbWFya2VyX2lkLCBzdGFydHNfd2l0aCgiTU9JXyIpKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgZ3JvdXBfYnkoc3ViamVjdF9pZCwgZXBpc29kZV9udW1iZXIpICU+JSAKICAjIEdldCBoaWdoZXN0IHBlci1tYXJrZXIgTU9JIG9ubHkgZm9yIGVhY2ggZXBpc29kZQogICMgKGRyb3AgbWFya2VyX2lkIGluIGNhc2Ugb2YgdGllcyB3aXRoIGhpZ2hlc3QgcGVyLW1hcmtlciBNT0kpCiAgc2VsZWN0KC1tYXJrZXJfaWQpICU+JSAKICBkaXN0aW5jdCgpICU+JSAKICBmaWx0ZXIoTU9JX3Blcl9tYXJrZXIgPT0gbWF4KE1PSV9wZXJfbWFya2VyLCBuYS5ybSA9IFRSVUUpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUoTU9JX3N1bW1lZCA9IHN1bShNT0lfcGVyX2VwaXNvZGUsIG5hLnJtID0gVFJVRSkpCmBgYAoKUHJlcGFyZSB0ZXN0IGRhdGEKYGBge3J9CiMgRmluaXNoIGRhdGEgcHJlcGFyYXRpb24KICBpbmRpdl9oYXBsb3R5cGVfZGF0YSA8LSBpbmRpdl9oYXBsb3R5cGVfZGF0YSAlPiUgCiAgICBncm91cF9ieShlcGlzb2RlX251bWJlcikgJT4lIAogICAgZ3JvdXBfc3BsaXQoKSAlPiUgCiAgICBsYXBwbHkoZnVuY3Rpb24oeCkgewogICAgICByZXMgPC0geCAlPiUgCiAgICAgICAgc2VsZWN0KHNhbXBsZV9pZCwgZXBpc29kZV9udW1iZXIsIAogICAgICAgICAgICAgICBtYXJrZXJfaWQsIGhhcGxvdHlwZSwgZnJlcXVlbmN5KSAlPiUgCiAgICAgICAgIyBGb3Igc2Vuc2l0aXZpdHkgYW5hbHlzaXMsIGFsbG93IHRvIGluY2x1ZGUvZHJvcCBhbGxlbGUgCiAgICAgICAgIyBiYXNlZCBvbiB0aGVpciB3aXRoaW4taW5kaXZpZHVhbCBmcmVxdWVuY3kKICAgICAgICBmaWx0ZXIoZnJlcXVlbmN5ID49IFdJVEhJTl9JTkRJVklEVUFMX0FMTEVMRV9GUkVRX1RIUikgJT4lIAogICAgICAgIHNlbGVjdCgtc2FtcGxlX2lkLCAtZXBpc29kZV9udW1iZXIsIC1mcmVxdWVuY3kpICU+JSAKICAgICAgICBkaXN0aW5jdCgpICU+JSAKICAgICAgICAjIFByZXZlbnQgZHJvcHBpbmcgb2YgbWFya2VycyB0aGF0IGFyZSBub3QgY2hhcmFjdGVyaXNlZCAKICAgICAgICAjIGJ5IHNldHRpbmcgLmRyb3AgdG8gRkFMU0UKICAgICAgICBncm91cF9ieShtYXJrZXJfaWQsIC5kcm9wID0gRkFMU0UpICU+JSAKICAgICAgICBncm91cF9zcGxpdCgpICU+JSAKICAgICAgICBsYXBwbHkoZnVuY3Rpb24oeSkgewogICAgICAgICAgdW5pcXVlKHkkaGFwbG90eXBlKQogICAgICAgIH0pCiAgICAgIAogICAgICAjIFJldHVybmVkIGEgbGlzdCBuYW1lZCB3aXRoIGVhY2ggZXBpc29kZSwgCiAgICAgICMgc2V0dGluZyBtYXJrZXIgYWxsZWxlIHRvIE5BIGluIGNhc2Ugbm9uZSBhcmUgb2JzZXJ2ZWQKICAgICAgcmV0dXJuKGxhcHBseShzZXROYW1lcyhyZXMsIEJFTkNITUFSS19NQVJLRVJTKSwgCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeSkgewogICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCh5KSA9PSAwKSByZXR1cm4oTkEpIGVsc2UgcmV0dXJuKHkpCiAgICAgICAgICAgICAgICAgICAgfSkpCiAgICB9KQpgYGAKCmBgYHtyIHJ1biBjb21wdXRlIHBvc3Qgb25lIGluZGl2fQojIFJ1biBBaW1lZSdzIHBvc3RlcmlvciBlc3RpbWF0aW9uCmluZGl2X3Bvc3RlcmlvciA8LSBQdjNSczo6Y29tcHV0ZV9wb3N0ZXJpb3IoeSAgPSBpbmRpdl9oYXBsb3R5cGVfZGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMgPSBmc1tCRU5DSE1BUktfTUFSS0VSU10pCgppbmRpdl9wb3N0ZXJpb3IKYGBgClRoZSBqb2ludCBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkgb2YgcmVpbmZlY3Rpb24gaXMgOTkuOCUsIHdoZW4gd2UgbG9vayBhdCB0aGUgZ2VuZXRpYyBkYXRhLCB0aGlzIGlzIGluIGxpbmUgd2l0aCB0aGUgaW5mZXJyZWQgcHJvYmFiaWxpdHkgb2YgcmVsYXBzZS4gCmBgYHtyIHBsb3QgaGFwc30KcGVydV9yZWN1cnJlbnQgJT4lIAogIGZpbHRlcihwYXRpZW50X25hbWUgPT0gIk0xQTAyMEIiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gaGFwbG90eXBlLCB5ID0gZmFjdG9yKGRhdGUpLCBmaWxsID0gZmFjdG9yKGhhcGxvdHlwZSkpKSArCiAgZ2VvbV90aWxlKCkgKwogICAgZmFjZXRfZ3JpZCh+bWFya2VyX2lkLCBzY2FsZXMgPSAiZnJlZV94IikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkKYGBgCgojIyMgUnVuIFB2M1JzIG9uZSByYW5kb20gaW5kaXZpZHVhbApgYGB7ciBzdWJzZXQgaGFwbG90eXBlIGRhdGEgYXQgcmFuZG9tfQojIFRoaXMgaGFzIGJlZW4gbW9kaWZpZWQgZnJvbSBUaG9tYXMvSmFzb24gc2NyaXB0IAoKIyMgUGljayBhbiBpbmRpdmlkdWFsIGF0IHJhbmRvbSB0byBydW4gUHYzUnMKaW5kaXZfbmFtZSA8LSBzYW1wbGUodW5pcXVlKGFuYWx5c2lzX2RhdGEkc3ViamVjdF9pZCksIHNpemUgPSAxKQoKIyMgUHJlcGFyZSB0aGUgZGF0YQojIDEtIFN1YnNldCBoYXBsb3R5cGUgZGF0YSB0byBzcGVjaWZpYyBpbmRpdmlkdWFsIGFuZCBhcHBseSBmaWx0ZXJzCmluZGl2X2hhcGxvdHlwZV9kYXRhIDwtIGFuYWx5c2lzX2RhdGEgJT4lIAogICMgUmVzdHJpY3QgdG8gYSBzaW5nbGUgcGF0aWVudAogIGZpbHRlcihzdWJqZWN0X2lkID09IGluZGl2X25hbWUpICU+JSAKICAjIFJlc3RyaWN0IHRvIGEgc3Vic2V0IG9mIG1hcmtlcnMsIGlmIG5lZWRlZAogIGZpbHRlcihtYXJrZXJfaWQgJWluJSBCRU5DSE1BUktfTUFSS0VSUykgJT4lIAogICMgUmVzdHJpY3QgdG8gc3VtbWVkIE1PSSBiZWxvdyB0aHJlc2hvbGQKICBncm91cF9ieShzdWJqZWN0X2lkLCBlcGlzb2RlX251bWJlciwgbWFya2VyX2lkKSAlPiUgCiAgbXV0YXRlKE1PSV9wZXJfbWFya2VyID0gc3VtKG4oKSkpICU+JSAKICBncm91cF9ieShzdWJqZWN0X2lkLCBlcGlzb2RlX251bWJlcikgJT4lIAogIG11dGF0ZShNT0lfcGVyX2VwaXNvZGUgPSBtYXgoTU9JX3Blcl9tYXJrZXIsIG5hLnJtID0gVFJVRSkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShtYXJrZXJfaWQgPSBmYWN0b3IobWFya2VyX2lkLCBsZXZlbHMgPSBCRU5DSE1BUktfTUFSS0VSUykpCgojIDItIENhbGN1bGF0ZSBwZXItZXBpc29kZSBhbmQgcGVyLXBhcnRpY2lwYW50IE1PSSBmb3IgUHZSM1MgZWxpZ2liaWxpdHkKaW5kaXZfTU9JIDwtIGluZGl2X2hhcGxvdHlwZV9kYXRhICU+JSAKICBzZWxlY3Qoc3ViamVjdF9pZCwgZXBpc29kZV9udW1iZXIsIAogICAgICAgICBtYXJrZXJfaWQsIHN0YXJ0c193aXRoKCJNT0lfIikpICU+JSAKICBkaXN0aW5jdCgpICU+JSAKICBncm91cF9ieShzdWJqZWN0X2lkLCBlcGlzb2RlX251bWJlcikgJT4lIAogICMgR2V0IGhpZ2hlc3QgcGVyLW1hcmtlciBNT0kgb25seSBmb3IgZWFjaCBlcGlzb2RlCiAgIyAoZHJvcCBtYXJrZXJfaWQgaW4gY2FzZSBvZiB0aWVzIHdpdGggaGlnaGVzdCBwZXItbWFya2VyIE1PSSkKICBzZWxlY3QoLW1hcmtlcl9pZCkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIGZpbHRlcihNT0lfcGVyX21hcmtlciA9PSBtYXgoTU9JX3Blcl9tYXJrZXIsIG5hLnJtID0gVFJVRSkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShNT0lfc3VtbWVkID0gc3VtKE1PSV9wZXJfZXBpc29kZSwgbmEucm0gPSBUUlVFKSkKYGBgCgoKTm93IHRoYXQgdGhlIGRhdGEgaGFzIGJlZW4gc3Vic2V0LCBQdjNSczo6Y29tcHV0ZV9wb3N0ZXJpb3IoKSB3aWxsIGJlIGNhbGxlZCAob25seSBpZiB0aGUgcGFydGljaXBhbnQgbWVldHMgZWxpZ2liaWxpdHkgY3JpdGVyaWEgYXMgZGVmaW5lZCBieSB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBzZXQgZWFybGllciBpbiB0aGlzIHJlcG9ydCkuCgpgYGB7ciBydW4gUHYzUnMgb25lIHJhbmRvbSBpbmRpdiwgZXZhbD1GfQppZiAoUlVOX0VYQU1QTEUgJiB1bmlxdWUoaW5kaXZfTU9JJE1PSV9zdW1tZWQpIDw9IE1BWF9NT0lfVE9fSU5DTFVERSkgewogICMgVmVyYm9zZQogIGNhdCgiUnVubmluZyBQdjNScyBmb3I6ICIsIAogICAgICBpbmRpdl9uYW1lLCAKICAgICAgIiAoc3VtbWVkIE1PSSA9ICIsIAogICAgICB1bmlxdWUoaW5kaXZfTU9JJE1PSV9zdW1tZWQpLCAKICAgICAgIikuXG4iLCAKICAgICAgc2VwID0gIiIpCiAgCiAgIyBGaW5pc2ggZGF0YSBwcmVwYXJhdGlvbgogIGluZGl2X2hhcGxvdHlwZV9kYXRhIDwtIGluZGl2X2hhcGxvdHlwZV9kYXRhICU+JSAKICAgIGdyb3VwX2J5KGVwaXNvZGVfbnVtYmVyKSAlPiUgCiAgICBncm91cF9zcGxpdCgpICU+JSAKICAgIGxhcHBseShmdW5jdGlvbih4KSB7CiAgICAgIHJlcyA8LSB4ICU+JSAKICAgICAgICBzZWxlY3Qoc2FtcGxlX2lkLCBlcGlzb2RlX251bWJlciwgCiAgICAgICAgICAgICAgIG1hcmtlcl9pZCwgaGFwbG90eXBlLCBmcmVxdWVuY3kpICU+JSAKICAgICAgICAjIEZvciBzZW5zaXRpdml0eSBhbmFseXNpcywgYWxsb3cgdG8gaW5jbHVkZS9kcm9wIGFsbGVsZSAKICAgICAgICAjIGJhc2VkIG9uIHRoZWlyIHdpdGhpbi1pbmRpdmlkdWFsIGZyZXF1ZW5jeQogICAgICAgIGZpbHRlcihmcmVxdWVuY3kgPj0gV0lUSElOX0lORElWSURVQUxfQUxMRUxFX0ZSRVFfVEhSKSAlPiUgCiAgICAgICAgc2VsZWN0KC1zYW1wbGVfaWQsIC1lcGlzb2RlX251bWJlciwgLWZyZXF1ZW5jeSkgJT4lIAogICAgICAgIGRpc3RpbmN0KCkgJT4lIAogICAgICAgICMgUHJldmVudCBkcm9wcGluZyBvZiBtYXJrZXJzIHRoYXQgYXJlIG5vdCBjaGFyYWN0ZXJpc2VkIAogICAgICAgICMgYnkgc2V0dGluZyAuZHJvcCB0byBGQUxTRQogICAgICAgIGdyb3VwX2J5KG1hcmtlcl9pZCwgLmRyb3AgPSBGQUxTRSkgJT4lIAogICAgICAgIGdyb3VwX3NwbGl0KCkgJT4lIAogICAgICAgIGxhcHBseShmdW5jdGlvbih5KSB7CiAgICAgICAgICB1bmlxdWUoeSRoYXBsb3R5cGUpCiAgICAgICAgfSkKICAgICAgCiAgICAgICMgUmV0dXJuZWQgYSBsaXN0IG5hbWVkIHdpdGggZWFjaCBlcGlzb2RlLCAKICAgICAgIyBzZXR0aW5nIG1hcmtlciBhbGxlbGUgdG8gTkEgaW4gY2FzZSBub25lIGFyZSBvYnNlcnZlZAogICAgICByZXR1cm4obGFwcGx5KHNldE5hbWVzKHJlcywgQkVOQ0hNQVJLX01BUktFUlMpLCAKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih5KSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoKHkpID09IDApIHJldHVybihOQSkgZWxzZSByZXR1cm4oeSkKICAgICAgICAgICAgICAgICAgICB9KSkKICAgIH0pCiAgCiAgIyBSdW4gQWltZWUncyBwb3N0ZXJpb3IgZXN0aW1hdGlvbgogIGluZGl2X3Bvc3RlcmlvciA8LSBQdjNSczo6Y29tcHV0ZV9wb3N0ZXJpb3IoeSAgPSBpbmRpdl9oYXBsb3R5cGVfZGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcyA9IGZzW0JFTkNITUFSS19NQVJLRVJTXSkKfSBlbHNlIHsKICAjIFZlcmJvc2UKICBjYXQoIk5PVCBSdW5uaW5nIFB2M1JzIGZvcjogIiwgCiAgICAgIGluZGl2X25hbWUsIAogICAgICAiIGJlY2F1c2UgZWl0aGVyIHN1bW1lZCBNT0kgZXhjZWVkcyB0aHJlc2hvbGQgKG9ic2VydmVkID0gIiwgCiAgICAgIHVuaXF1ZShpbmRpdl9NT0kkTU9JX3N1bW1lZCksIAogICAgICAiLCBNQVhfTU9JX1RPX0lOQ0xVREUgPSAiLCAKICAgICAgTUFYX01PSV9UT19JTkNMVURFLCAKICAgICAgIiksIG9yIFJVTl9FWEFNUExFIHdhcyBzZXQgdG8gRkFMU0UuXG4iLCAKICAgICAgc2VwID0gIiIpCiAgCiAgIyBSZXR1cm4gTlVMTAogIGluZGl2X3Bvc3RlcmlvciA8LSBOVUxMCn0KCmluZGl2X3Bvc3RlcmlvcgpgYGAKYGBge3IgcGxvdCBoYXBzIGZvciBpbmRpdiwgZXZhbD1GfQpwZXJ1X3JlY3VycmVudCAlPiUgCiAgZmlsdGVyKHBhdGllbnRfbmFtZSA9PSBpbmRpdl9uYW1lKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gaGFwbG90eXBlLCB5ID0gZmFjdG9yKGRhdGUpLCBmaWxsID0gZmFjdG9yKGhhcGxvdHlwZSkpKSArCiAgZ2VvbV90aWxlKCkgKwogICAgZmFjZXRfZ3JpZCh+bWFya2VyX2lkLCBzY2FsZXMgPSAiZnJlZV94IikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkKYGBgCgojIyMgUnVuIGZvciBhbGwgcGFydGljaXBhbnRzCmBgYHtyIHJ1biBwdjNycyBmb3IgYWxsfQojIFN0YXJ0IHRpbWVyCnRfc3RhcnQgPC0gU3lzLnRpbWUoKQoKIyBJbml0aWFsaXplIGFuIGVtcHR5IGxpc3QgdG8gc3RvcmUgdGhlIHJlc3VsdHMKaW5kaXZfcG9zdGVyaW9ycyA8LSBsaXN0KCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggdW5pcXVlIGluZGl2aWR1YWwgbmFtZQpmb3IgKGluZGl2X25hbWUgaW4gdW5pcXVlKGFuYWx5c2lzX2RhdGEkc3ViamVjdF9pZCkpIHsKICAjIFZlcmJvc2UKICBjYXQoIklEIDogIiwgaW5kaXZfbmFtZSwgIi4uLlxuIiwgc2VwID0gIiIpCiAgCiAgIyMgUHJlcGFyZSB0aGUgZGF0YQogICMgMS0gU3Vic2V0IGhhcGxvdHlwZSBkYXRhIHRvIHNwZWNpZmljIGluZGl2aWR1YWwgYW5kIGFwcGx5IGZpbHRlcnMKICBpbmRpdl9oYXBsb3R5cGVfZGF0YSA8LSBhbmFseXNpc19kYXRhICU+JSAKICAgICMgUmVzdHJpY3QgdG8gYSBzaW5nbGUgcGF0aWVudAogICAgZmlsdGVyKHN1YmplY3RfaWQgPT0gaW5kaXZfbmFtZSkgJT4lIAogICAgIyBSZXN0cmljdCB0byBhIHN1YnNldCBvZiBtYXJrZXJzCiAgICBmaWx0ZXIobWFya2VyX2lkICVpbiUgQkVOQ0hNQVJLX01BUktFUlMpICU+JSAKICAgICMgUmVzdHJpY3QgdG8gc3VtbWVkIE1PSSBiZWxvdyB0aHJlc2hvbGQKICAgIGdyb3VwX2J5KHN1YmplY3RfaWQsIGVwaXNvZGVfbnVtYmVyLCBtYXJrZXJfaWQpICU+JSAKICAgIG11dGF0ZShNT0lfcGVyX21hcmtlciA9IHN1bShuKCkpKSAlPiUgCiAgICBncm91cF9ieShzdWJqZWN0X2lkLCBlcGlzb2RlX251bWJlcikgJT4lIAogICAgbXV0YXRlKE1PSV9wZXJfZXBpc29kZSA9IG1heChNT0lfcGVyX21hcmtlciwgbmEucm0gPSBUUlVFKSkgJT4lIAogICAgdW5ncm91cCgpICU+JSAKICAgIG11dGF0ZShtYXJrZXJfaWQgPSBmYWN0b3IobWFya2VyX2lkLCBsZXZlbHMgPSBCRU5DSE1BUktfTUFSS0VSUykpCiAgCiAgIyAyLSBDYWxjdWxhdGUgcGVyLWVwaXNvZGUgYW5kIHBlci1wYXJ0aWNpcGFudCBNT0kgZm9yIFB2UjNTIGVsaWdpYmlsaXR5CiAgaW5kaXZfTU9JIDwtIGluZGl2X2hhcGxvdHlwZV9kYXRhICU+JSAKICAgIHNlbGVjdChzdWJqZWN0X2lkLCBlcGlzb2RlX251bWJlciwgCiAgICAgICAgICAgbWFya2VyX2lkLCBzdGFydHNfd2l0aCgiTU9JXyIpKSAlPiUgCiAgICBkaXN0aW5jdCgpICU+JSAKICAgIGdyb3VwX2J5KHN1YmplY3RfaWQsIGVwaXNvZGVfbnVtYmVyKSAlPiUgCiAgICAjIEdldCBoaWdoZXN0IHBlci1tYXJrZXIgTU9JIG9ubHkgZm9yIGVhY2ggZXBpc29kZQogICAgIyAoZHJvcCBtYXJrZXJfaWQgaW4gY2FzZSBvZiB0aWVzIHdpdGggaGlnaGVzdCBwZXItbWFya2VyIE1PSSkKICAgIHNlbGVjdCgtbWFya2VyX2lkKSAlPiUgCiAgICBkaXN0aW5jdCgpICU+JSAKICAgIGZpbHRlcihNT0lfcGVyX21hcmtlciA9PSBtYXgoTU9JX3Blcl9tYXJrZXIsIG5hLnJtID0gVFJVRSkpICU+JSAKICAgIHVuZ3JvdXAoKSAlPiUgCiAgICBtdXRhdGUoTU9JX3N1bW1lZCA9IHN1bShNT0lfcGVyX2VwaXNvZGUsIG5hLnJtID0gVFJVRSkpCiAgCiAgIyMgUnVuIFB2M1JzIG9ubHkgaWYgTU9JIGJlbG93IHRocmVzaG9sZCAgICAgICAgIAogIGlmICh1bmlxdWUoaW5kaXZfTU9JJE1PSV9zdW1tZWQpIDw9IE1BWF9NT0lfVE9fSU5DTFVERSkgewogICAgIyBWZXJib3NlCiAgICBjYXQoIlJ1bm5pbmcgUHYzUnMgZm9yOiAiLCAKICAgICAgICBpbmRpdl9uYW1lLCAKICAgICAgICAiIChzdW1tZWQgTU9JID0gIiwgCiAgICAgICAgdW5pcXVlKGluZGl2X01PSSRNT0lfc3VtbWVkKSwgCiAgICAgICAgIikuXG4iLCAKICAgICAgICBzZXAgPSAiIikKICAgIAogICAgIyBQcmVzZXJ2ZSByb3VuZHMgZm9yIG5hbWluZyB0aGUgb3V0cHV0IGxpc3QKICAgIGluZGl2X2VwaXNvZGUgPC0gdW5pcXVlKGluZGl2X2hhcGxvdHlwZV9kYXRhJGVwaXNvZGVfbnVtYmVyKQogICAgCiAgICAjIEZpbmlzaCBkYXRhIHByZXBhcmF0aW9uCiAgICBpbmRpdl9oYXBsb3R5cGVfZGF0YSA8LSBpbmRpdl9oYXBsb3R5cGVfZGF0YSAlPiUgCiAgICAgIGdyb3VwX2J5KGVwaXNvZGVfbnVtYmVyKSAlPiUgCiAgICAgIGdyb3VwX3NwbGl0KCkgJT4lIAogICAgICBsYXBwbHkoZnVuY3Rpb24oeCkgewogICAgICAgIHJlcyA8LSB4ICU+JSAKICAgICAgICAgIHNlbGVjdChzYW1wbGVfaWQsIGVwaXNvZGVfbnVtYmVyLCAKICAgICAgICAgICAgICAgICBtYXJrZXJfaWQsIGhhcGxvdHlwZSwgZnJlcXVlbmN5KSAlPiUgCiAgICAgICAgICAjIEZvciBzZW5zaXRpdml0eSBhbmFseXNpcywgYWxsb3cgdG8gaW5jbHVkZS9kcm9wIGFsbGVsZSAKICAgICAgICAgICMgYmFzZWQgb24gdGhlaXIgd2l0aGluLWluZGl2aWR1YWwgZnJlcXVlbmN5CiAgICAgICAgICBmaWx0ZXIoZnJlcXVlbmN5ID49IFdJVEhJTl9JTkRJVklEVUFMX0FMTEVMRV9GUkVRX1RIUikgJT4lIAogICAgICAgICAgc2VsZWN0KC1zYW1wbGVfaWQsIC1lcGlzb2RlX251bWJlciwgLWZyZXF1ZW5jeSkgJT4lIAogICAgICAgICAgZGlzdGluY3QoKSAlPiUgCiAgICAgICAgICAjIFByZXZlbnQgZHJvcHBpbmcgb2YgbWFya2VycyB0aGF0IGFyZSBub3QgY2hhcmFjdGVyaXplZCAKICAgICAgICAgICMgYnkgc2V0dGluZyAuZHJvcCB0byBGQUxTRQogICAgICAgICAgZ3JvdXBfYnkobWFya2VyX2lkLCAuZHJvcCA9IEZBTFNFKSAlPiUgCiAgICAgICAgICBncm91cF9zcGxpdCgpICU+JSAKICAgICAgICAgIGxhcHBseShmdW5jdGlvbih5KSB7CiAgICAgICAgICAgIHVuaXF1ZSh5JGhhcGxvdHlwZSkKICAgICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgIyBSZXR1cm5lZCBhIGxpc3QgbmFtZWQgd2l0aCBlYWNoIGVwaXNvZGUsIAogICAgICAgICMgc2V0dGluZyBtYXJrZXIgYWxsZWxlIHRvIE5BIGluIGNhc2Ugbm9uZSBhcmUgb2JzZXJ2ZWQKICAgICAgICByZXR1cm4obGFwcGx5KHNldE5hbWVzKHJlcywgQkVOQ0hNQVJLX01BUktFUlMpLCAKICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCh5KSA9PSAwKSByZXR1cm4oTkEpIGVsc2UgcmV0dXJuKHkpCiAgICAgICAgICAgICAgICAgICAgICB9KSkKICAgICAgfSkKICAgIAogICAgIyBSdW4gQWltZWUncyBwb3N0ZXJpb3IgZXN0aW1hdGlvbgogICAgaW5kaXZfcG9zdGVyaW9yIDwtIGNvbXB1dGVfcG9zdGVyaW9yKHkgICAgID0gaW5kaXZfaGFwbG90eXBlX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMgICAgPSBmc1tCRU5DSE1BUktfTUFSS0VSU10sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gbWF0cml4KFBSSU9SXzNSUywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyAgICAgPSBsZW5ndGgoaW5kaXZfaGFwbG90eXBlX2RhdGEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sICAgICA9IGxlbmd0aChQUklPUl8zUlMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXJvdyAgICA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbW5hbWVzID0gbGlzdChjKDE6bGVuZ3RoKGluZGl2X2hhcGxvdHlwZV9kYXRhKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcyhQUklPUl8zUlMpKSkpCiAgICAKICB9IGVsc2UgewogICAgIyBWZXJib3NlCiAgICBjYXQoIk5PVCBSdW5uaW5nIFB2M1JzIGZvcjogIiwgCiAgICAgICAgaW5kaXZfbmFtZSwgCiAgICAgICAgIiBiZWNhdXNlIHN1bW1lZCBNT0kgZXhjZWVkcyB0aHJlc2hvbGQgKG9ic2VydmVkID0gIiwgCiAgICAgICAgdW5pcXVlKGluZGl2X01PSSRNT0lfc3VtbWVkKSwgCiAgICAgICAgIiwgTUFYX01PSV9UT19JTkNMVURFID0gIiwgCiAgICAgICAgTUFYX01PSV9UT19JTkNMVURFLCAKICAgICAgICAiKS5cbiIsIAogICAgICAgIHNlcCA9ICIiKQogICAgCiAgICAjIFJldHVybiBOVUxMCiAgICBpbmRpdl9lcGlzb2RlICAgIDwtIHVuaXF1ZShpbmRpdl9oYXBsb3R5cGVfZGF0YSRlcGlzb2RlX251bWJlcikKICAgIGluZGl2X3Bvc3RlcmlvciA8LSBOVUxMCiAgfQogIAogICMgQXBwZW5kIHRoZSByZXN1bHRzIHRvIHRoZSBsaXN0CiAgaW5kaXZfcG9zdGVyaW9yc1tbaW5kaXZfbmFtZV1dIDwtIGxpc3QoInN1YmplY3RfaWQiID0gaW5kaXZfbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVwaXNvZGVfbnVtYmVyIiAgICAgICA9IGluZGl2X2VwaXNvZGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQdjNScyIgICAgICAgPSBpbmRpdl9wb3N0ZXJpb3IpCn0KCiMgRW5kIHRpbWVyCnRfZW5kIDwtIFN5cy50aW1lKCkKY2F0KCJQdjNScyBmb3IgdGhlIHdob2xlIGRhdGFzZXQgdG9vayA6ICIsIGFzLm51bWVyaWMoZGlmZnRpbWUodGltZTEgPSB0X2VuZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUyID0gdF9zdGFydCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzID0gInNlY3MiKSkvNjAsICIgbWlucyIsICJcbiIsIHNlcCA9ICIiKQoKIyBQcmVzZW50IHRoZSBtYXJnaW5hbCBkYXRhIGluIGEgY2xlYXJlciBmb3JtYXQKaW5kaXZfcG9zdGVyaW9yc19tYXJnaW5hbCA8LSBkby5jYWxsKHJiaW5kLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShpbmRpdl9wb3N0ZXJpb3JzLCBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXMubnVsbCh4W1siUHYzUnMiXV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGRhdGEuZnJhbWUoInN1YmplY3RfaWQiICAgICAgICAgICAgICAgPSB4W1sic3ViamVjdF9pZCJdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVwaXNvZGVfbnVtYmVyIiAgICAgICAgICAgICAgICAgICAgID0geFtbImVwaXNvZGVfbnVtYmVyIl1dWy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvc3Rlcmlvcl9tYXJnaW5hbF9wcm9iX0MiID0geFtbIlB2M1JzIl1dJG1hcmdbLCAiQyJdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9zdGVyaW9yX21hcmdpbmFsX3Byb2JfTCIgPSB4W1siUHYzUnMiXV0kbWFyZ1ssICJMIl0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3N0ZXJpb3JfbWFyZ2luYWxfcHJvYl9JIiA9IHhbWyJQdjNScyJdXSRtYXJnWywgIkkiXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkKcm93Lm5hbWVzKGluZGl2X3Bvc3RlcmlvcnNfbWFyZ2luYWwpIDwtIDE6bnJvdyhpbmRpdl9wb3N0ZXJpb3JzX21hcmdpbmFsKQoKIyBQcmVzZW50IHRoZSBqb2ludCBwb3N0ZXJpb3IgZXN0aW1hdGVzIGluIGEgY2xlYXJlciBmb3JtYXQKaW5kaXZfcG9zdGVyaW9yc19qb2ludCA8LSBkby5jYWxsKHJiaW5kLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShpbmRpdl9wb3N0ZXJpb3JzLCBmdW5jdGlvbih4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXMubnVsbCh4W1siUHYzUnMiXV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbnRfcHJvYnMgPC0geFtbIlB2M1JzIl1dJGpvaW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFeHRyYWN0IHRoZSBzdGF0ZSBwYWlycyBhbmQgcHJvYmFiaWxpdGllcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3BhaXJzIDwtIG5hbWVzKGpvaW50X3Byb2JzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JfdmFsdWVzIDwtIGFzLm51bWVyaWMoam9pbnRfcHJvYnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSBkYXRhIGZyYW1lIHdpdGggc3ViamVjdF9pZCwgZXBpc29kZV9udW1iZXIsIGFuZCBqb2ludCBwcm9iYWJpbGl0aWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGRhdGEuZnJhbWUoInN1YmplY3RfaWQiICAgICAgPSByZXAoeFtbInN1YmplY3RfaWQiXV0sIGxlbmd0aChzdGF0ZV9wYWlycykpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXBpc29kZV9udW1iZXIiICA9IHJlcCh4W1siZXBpc29kZV9udW1iZXIiXV1bLTFdLCBlYWNoID0gbGVuZ3RoKHN0YXRlX3BhaXJzKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRlX3BhaXIiICAgICAgPSBzdGF0ZV9wYWlycywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpvaW50X3Byb2JhYmlsaXR5IiA9IHByb2JfdmFsdWVzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpCnJvdy5uYW1lcyhpbmRpdl9wb3N0ZXJpb3JzX2pvaW50KSA8LSAxOm5yb3coaW5kaXZfcG9zdGVyaW9yc19qb2ludCkKCiMgU2F2ZSBQdjNScyBvdXRwdXQgYmVjYXVzZSBpdCdzIHRpbWUgY29uc3VtaW5nIGFuZCAKIyB3ZSBkb24ndCB3YW50IHRvIHJlLXJ1biBpdCBldmVyeSB0aW1lLgpzYXZlKGxpc3QgPSBjKCJSVU5fRVhBTVBMRSIsICJXSVRISU5fSU5ESVZJRFVBTF9BTExFTEVfRlJFUV9USFIiLCAiQkVOQ0hNQVJLX01BUktFUlMiLCAiTUFYX01PSV9UT19JTkNMVURFIiwgIlBSSU9SXzNSUyIsIAogICAgICAgICAgICAgICJhbmFseXNpc19kYXRhIiwgImZzIiwgCiAgICAgICAgICAgICAgImluZGl2X3Bvc3RlcmlvcnMiLCAiaW5kaXZfcG9zdGVyaW9yc19tYXJnaW5hbCIsICJpbmRpdl9wb3N0ZXJpb3JzX2pvaW50IiksIAogICAgIGZpbGUgPSBwYXN0ZTAoIi4vb3V0cHV0cy9QdjNSc19wZXJ1X3Bvc3RlcmlvcnNfIiwgCiAgICAgICAgICAgICAgICAgICBzdHJmdGltZShTeXMudGltZSgpLCBmb3JtYXQgPSAiJVklbSVkXyVIJU0lUyIpLCAKICAgICAgICAgICAgICAgICAgICIuUkRhdGEiKSkKYGBgCiMjIyBFeHBsb3JlIHRoZSBwb3N0ZXJpb3IKVGhlIG1hcmdpbmFsIHByb2JhYmlsaXRpZXMgZ2l2ZSB1cyB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIHRocmVlIHN0YXRlcyBmb3IgZWFjaCByZWN1cnJlbnQgZXBpc29kZS4gSG93ZXZlciwgdGhpcyBkb2VzIG5vdCBjb25zaWRlciB0aGUgam9pbnQgcHJvYmFiaWxpdHkgb2YgZGlmZmVyZW50IHN0YXRlcyB3aGVuIGEgcGVyc29uIGV4cGVyaWVuY2VkIG1vcmUgdGhhbiBvbmUgcmVjdXJyZW50IGVwaXNvZGUuIAoKYGBge3IgbWFyZ2luYWwgcHJvYnN9CmluZGl2X3Bvc3RlcmlvcnNfbWFyZ2luYWwKYGBgCgpUaGUgam9pbnQgcHJvYmFiaWxpdGVzIGdpdmUgdXMgdmFsdWVzIGZvciBlYWNoIHBvc3NpYmxlIGNvbWJpbmF0aW9uIG9mIHN0YXRlcywgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgcmVjdXJyZW50IGVwaXNvZGVzIGV4cGVyaWVuY2VkIGJ5IHRoZSBwYXJ0aWNpcGFudC4gCmBgYHtyIGpvaW50IHByb2JzfQpqb2ludF9zdW1tYXJ5IDwtIGluZGl2X3Bvc3RlcmlvcnNfam9pbnQgJT4lIAogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KHN1YmplY3RfaWQsIHN0YXRlX3BhaXIsIGpvaW50X3Byb2JhYmlsaXR5KSAlPiUgCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGVwaXNvZGVfbnVtYmVyID09IG1heChlcGlzb2RlX251bWJlcikpICU+JSAKICAgICAgICAgICAgICAgICAgICBtdXRhdGUocGVyY2VudGFnZSA9IHJvdW5kKGpvaW50X3Byb2JhYmlsaXR5KjEwMCwgMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3JlY3VycmVuY2VzID0gZXBpc29kZV9udW1iZXItMSkgJT4lCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0KC1lcGlzb2RlX251bWJlcikgJT4lIAogICAgICAgICAgICAgICAgICAgIGFycmFuZ2Uoc3ViamVjdF9pZCwgdG90YWxfcmVjdXJyZW5jZXMsIHBlcmNlbnRhZ2UpICU+JSAKICAgICAgICAgICAgICAgICAgICByZWxvY2F0ZSh0b3RhbF9yZWN1cnJlbmNlcywgLmJlZm9yZSA9IHN0YXRlX3BhaXIpCgpqb2ludF9zdW1tYXJ5CmBgYAoKIyMgUGxvdCBtYXJnaW5hbCBwcm9iYWJpbGl0aWVzCmBgYHtyIG1hcmcgcHJvYnN9Cm1hcmdpbmFsX3N1bW1hcnkgPC0gaW5kaXZfcG9zdGVyaW9yc19tYXJnaW5hbCAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAhc3ViamVjdF9pZCAmICFlcGlzb2RlX251bWJlciwgCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInBvc3Rlcmlvcl90eXBlIiwgCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwb3N0ZXJpb3JfdmFsdWUiKSAlPiUgCiAgbXV0YXRlKHBvc3Rlcmlvcl9jbGFzc2lmaWNhdGlvbiA9IGNhc2Vfd2hlbihwb3N0ZXJpb3JfdHlwZSA9PSAiUG9zdGVyaW9yX21hcmdpbmFsX3Byb2JfQyIgfiAiUmVjcnVkZXNjZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0ZXJpb3JfdHlwZSA9PSAiUG9zdGVyaW9yX21hcmdpbmFsX3Byb2JfTCIgfiAiUmVsYXBzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0ZXJpb3JfdHlwZSA9PSAiUG9zdGVyaW9yX21hcmdpbmFsX3Byb2JfSSIgfiAiUmVpbmZlY3Rpb24iKSwKICAgICAgICAgcG9zdGVyaW9yX2NsYXNzaWZpY2F0aW9uID0gZmFjdG9yKHBvc3Rlcmlvcl9jbGFzc2lmaWNhdGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJSZWxhcHNlIiwgIlJlY3J1ZGVzY2VuY2UiLCAiUmVpbmZlY3Rpb24iKSkpICU+JSAKICBzZWxlY3QoLXBvc3Rlcmlvcl90eXBlKQoKbWFyZ2luYWxfc3VtbWFyeQpgYGAKCiMjIyBCeSBlcGlzb2RlIG51bWJlcgpgYGB7ciBwbG90IHByb2JhYmlsaXRpZXMsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTh9Cm1hcmdpbmFsX3N1bW1hcnkgJT4lIAogIGdyb3VwX2J5KHN1YmplY3RfaWQpICU+JQogIGFycmFuZ2UoZGVzYyhwb3N0ZXJpb3JfdmFsdWUpLCAuYnlfZ3JvdXAgPSBUUlVFKSAlPiUKICBtdXRhdGUoc3ViamVjdF9pZCA9IGZhY3RvcihzdWJqZWN0X2lkLCBsZXZlbHMgPSB1bmlxdWUoc3ViamVjdF9pZFtvcmRlcihwb3N0ZXJpb3JfdmFsdWUsIGRlY3JlYXNpbmcgPSBUUlVFKV0pKSkgJT4lCiAgCiAgICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoZXBpc29kZV9udW1iZXIpLCB5ID0gcG9zdGVyaW9yX3ZhbHVlLCBncm91cCA9IGVwaXNvZGVfbnVtYmVyLCBmaWxsID0gcG9zdGVyaW9yX2NsYXNzaWZpY2F0aW9uKSkgKyAKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiUmVsYXBzZSIgPSAidHVycXVvaXNlMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY3J1ZGVzY2VuY2UiID0gInNreWJsdWU0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVpbmZlY3Rpb24iID0gIm1hZ2VudGEzIikpICsKICAgIAogICAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAsIDApKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogICAgCiAgICBsYWJzKHggICAgID0gIkVwaXNvZGUgbnVtYmVyIiwgCiAgICAgICAgIHkgICAgID0gIlBvc3RlcmlvciBwcm9iYWJpbGl0eSIsIAogICAgICAgICBmaWxsID0gIiIpICsgCiAgICB0aGVtZV9idygpICsKICAgIGZhY2V0X3dyYXAofnN1YmplY3RfaWQpCmBgYAojIyMgQnkgY29tbXVuaXR5CmBgYHtyIHBsb3QgcHJvYmFiaWxpdGVzIGJ5IGNvbW11bml0eSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9OH0KbWFyZ2luYWxfc3VtbWFyeSAlPiUgCiAgbGVmdF9qb2luKGFuYWx5c2lzX2RhdGEgJT4lIHNlbGVjdChzdWJqZWN0X2lkLCBjb21tdW5pdHkpICU+JSBkaXN0aW5jdCgpLCAKICAgICAgICAgICAgYnkgPSAic3ViamVjdF9pZCIpICU+JSAKICBncm91cF9ieShzdWJqZWN0X2lkKSAlPiUgCiAgYXJyYW5nZShkZXNjKHBvc3Rlcmlvcl92YWx1ZSksIC5ieV9ncm91cCA9IFRSVUUpICU+JSAKICBtdXRhdGUoc3ViamVjdF9pZCA9IGZhY3RvcihzdWJqZWN0X2lkLCBsZXZlbHMgPSB1bmlxdWUoc3ViamVjdF9pZFtvcmRlcihwb3N0ZXJpb3JfdmFsdWUsIGRlY3JlYXNpbmcgPSBUUlVFKV0pKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGZhY3RvcihlcGlzb2RlX251bWJlciksIHkgPSBwb3N0ZXJpb3JfdmFsdWUsIGdyb3VwID0gZXBpc29kZV9udW1iZXIsIGZpbGwgPSBwb3N0ZXJpb3JfY2xhc3NpZmljYXRpb24pKSArIAogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJSZWxhcHNlIiA9ICJ0dXJxdW9pc2UzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY3J1ZGVzY2VuY2UiID0gInNreWJsdWU0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlaW5mZWN0aW9uIiA9ICJtYWdlbnRhMyIpKSArCiAgCiAgICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwgMCkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgICBsYWJzKHggICAgID0gIkVwaXNvZGUgbnVtYmVyIiwgCiAgICAgICAgIHkgICAgID0gIlBvc3RlcmlvciBwcm9iYWJpbGl0eSIsIAogICAgICAgICBmaWxsID0gIiIpICsgCiAgICB0aGVtZV9idygpICsKICAgIGZhY2V0X3dyYXAoY29tbXVuaXR5IH4gc3ViamVjdF9pZCkKYGBgCiMjIyBCeSBkYXlzIHNpbmNlIGZpcnN0IGVwaXNvZGUgZHVyaW5nIHN0dWR5IHBlcmlvZApgYGB7ciBwbG90IHBvc3RlcmlvciBwcm9iYWJpbGl0aWVzIHdpdGggdGltZSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9OH0KbWFyZ2luYWxfc3VtbWFyeSAlPiUgCiAgbGVmdF9qb2luKGFuYWx5c2lzX2RhdGEgJT4lIHNlbGVjdChzdWJqZWN0X2lkLCBlcGlzb2RlX251bWJlciwgY29tbXVuaXR5LCB2aXNpdF9kYXRlLCBkYXlzX3NpbmNlX2Vucm9sbWVudCwgZGF5c19zaW5jZV9sYXN0X2VwaXNvZGUpICU+JSBkaXN0aW5jdCgpLCAKICAgICAgICAgICAgYnkgPSBjKCJzdWJqZWN0X2lkIiwgImVwaXNvZGVfbnVtYmVyIikpICU+JSAKICBncm91cF9ieShzdWJqZWN0X2lkKSAlPiUKICBhcnJhbmdlKGRlc2MocG9zdGVyaW9yX3ZhbHVlKSwgLmJ5X2dyb3VwID0gVFJVRSkgJT4lCiAgbXV0YXRlKHN1YmplY3RfaWQgPSBmYWN0b3Ioc3ViamVjdF9pZCwgbGV2ZWxzID0gdW5pcXVlKHN1YmplY3RfaWRbb3JkZXIocG9zdGVyaW9yX3ZhbHVlLCBkZWNyZWFzaW5nID0gVFJVRSldKSkpICU+JQogIGdncGxvdChhZXMoeCA9IGRheXNfc2luY2VfZW5yb2xtZW50LCB5ID0gcG9zdGVyaW9yX3ZhbHVlLCBncm91cCA9IGVwaXNvZGVfbnVtYmVyLCBmaWxsID0gcG9zdGVyaW9yX2NsYXNzaWZpY2F0aW9uKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZmlsbCIsIHdpZHRoID0gMTApICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlJlbGFwc2UiID0gInR1cnF1b2lzZTMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVjcnVkZXNjZW5jZSIgPSAic2t5Ymx1ZTQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVpbmZlY3Rpb24iID0gIm1hZ2VudGEzIikpICsKICAKICAgIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIGxhYnMoeCAgICAgPSAiRGF5cyBzaW5jZSBmaXJzdCBlcGlzb2RlIiwgCiAgICAgICB5ICAgICA9ICJQb3N0ZXJpb3IgcHJvYmFiaWxpdHkiLCAKICAgICAgIGZpbGwgPSAiIikgKyAKICB0aGVtZV9idygpICsKICBmYWNldF93cmFwKH5zdWJqZWN0X2lkKQpgYGAKIyMgUGxvdCBqb2ludCBwcm9iYWJpbGl0aWVzCmBgYHtyIGNvbG9yIHBhbGV0dGVzfQpwYWwxIDwtIGMoCiAgIkMiID0gInR1cnF1b2lzZTMiLCAKICAiSSIgPSAibWFnZW50YTMiLCAKICAiTCIgPSAic2t5Ymx1ZTQiKQoKcGFsMiA8LSBjKAogICJJSSIgPSAibWFnZW50YTMiLAogICJJTCIgPSAiZGFya29yYW5nZTIiLAogICJMSSIgPSAiZ29sZGVucm9kMiIsCiAgIkxMIiA9ICJza3libHVlNCIsCiAgIkNJIiA9ICJzYWRkbGVicm93biIsCiAgIkNMIiA9ICJ0dXJxdW9pc2U0IgopCgpwYWwzIDwtIGMoCiAgIkxMTCIgPSAic2t5Ymx1ZTQiLAogICJMSUwiID0gImdvbGRlbnJvZDMiLAogICJJTEwiID0gIm9yYW5nZXJlZDMiLAogICJJSUwiID0gImRhcmtvcmFuZ2UzIiwKICAiTExJIiA9ICJvcmFuZ2UzIiwKICAiSUxJIiA9ICJzaWVubmE0IiwKICAiTElJIiA9ICJwZXJ1IiwKICAiSUlJIiA9ICJtYWdlbnRhMyIKKQoKY29tYmluZWRfcGFsIDwtIGMocGFsMSwgcGFsMiwgcGFsMykKYGBgCgpgYGB7ciBwbG90dGluZyBqb2ludCBmeG59CnBsb3RKb2ludFByb2IgPC0gZnVuY3Rpb24oZGF0YSwgcmVjdXJyZW5jZV9uLCBwcm9iX3RocmVzaG9sZCwgY29sb3JfcGFsZXR0ZSwgLi4uKXsKICBkYXRhICU+JSAKICAgIGZpbHRlcih0b3RhbF9yZWN1cnJlbmNlcyA9PSByZWN1cnJlbmNlX24sIGpvaW50X3Byb2JhYmlsaXR5ID4gcHJvYl90aHJlc2hvbGQpICU+JSAKICAgIGdyb3VwX2J5KHN1YmplY3RfaWQpICU+JSAKICAgIG11dGF0ZShzdGF0ZV9wYWlyID0gZmN0X3Jlb3JkZXIoc3RhdGVfcGFpciwgam9pbnRfcHJvYmFiaWxpdHkpKSAlPiUKICAgIHVuZ3JvdXAoKSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHggPSBqb2ludF9wcm9iYWJpbGl0eSwgCiAgICAgICAgICAgICAgIHkgPSBzdWJqZWN0X2lkLCAKICAgICAgICAgICAgICAgZmlsbCA9IHN0YXRlX3BhaXIpKSArCiAgICAgIGdlb21fYmFyKHBvc2l0aW9uID0gInN0YWNrIiwgc3RhdCA9ICJpZGVudGl0eSIpICsKICAgICAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICAgICAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAsIDApKSArCiAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX3BhbGV0dGUpICsKICAgICAgbGFicyh4ID0gIkpvaW50IHByb2JhYmlsaXR5IGVzdGltYXRlIiwKICAgICAgICAgICB5ID0gIlBhcnRpY2lwYW50IiwKICAgICAgICAgICBmaWxsID0gIkNsYXNzaWZpY2F0aW9uIHN0YXRlIikgKwogICAgICB0aGVtZV9idygpICsgCiAgICBmYWNldF93cmFwKH50b3RhbF9yZWN1cnJlbmNlcywgc2NhbGVzID0gImZyZWVfeSIpCn0KYGBgCgojIyMgQnkgdG90YWwgbnVtYmVyIG9mIHJlY3VycmVuY2VzCmBgYHtyIHBsb3Qgam9pbnQgYnkgcmVjdXJyZW5jZXMsIGZpZy5oZWlnaHQgPSA3LCBmaWcud2lkdGggPSAxMn0KcGxvdF9qb2ludDEgPC0gcGxvdEpvaW50UHJvYihqb2ludF9zdW1tYXJ5LCAxLCAwLCBwYWwxKSAKcGxvdF9qb2ludDIgPC0gcGxvdEpvaW50UHJvYihqb2ludF9zdW1tYXJ5LCAyLCAwLCBwYWwyKSArIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSAyKSkgCnBsb3Rfam9pbnQzIDwtIHBsb3RKb2ludFByb2Ioam9pbnRfc3VtbWFyeSwgMywgMC4wMDEsIHBhbDMpICsgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQobmNvbCA9IDMpKSAKCihwbG90X2pvaW50MSB8IHBsb3Rfam9pbnQyKSAvIChwbG90X2pvaW50MykgKwogIHBsb3RfYW5ub3RhdGlvbihzdWJ0aXRsZSA9ICJJID0gUmVpbmZlY3Rpb24sIEwgPSBSZWxhcHNlLCBDID0gUmVjcnVkZXNjZW5jZSIsCiAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSBleHByZXNzaW9uKGl0YWxpYygiRm9yID4yIHJlY3VycmVuY2VzLCBvbmx5IHByb2JhYmlsaXR5IGVzdGltYXRlcyA+IDAuMDAxIGFyZSBzaG93biIpKSkgKwogIHBsb3RfbGF5b3V0KGhlaWdodHMgPSBjKDQsIDAuNSkpCmBgYAojIyMgQnkgY29tbXVuaXR5IGFuZCBudW1iZXIgb2YgcmVjdXJyZW5jZXMKYGBge3IgcGxvdCBqb2ludCBieSB0cmVhdG1lbnQgYXJtLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLndpZHRoID0gMTJ9CmpvaW50X3N1bW1hcnkgJT4lIAogICAgbGVmdF9qb2luKGFuYWx5c2lzX2RhdGEgJT4lIHNlbGVjdChzdWJqZWN0X2lkLCBjb21tdW5pdHkpICU+JSBkaXN0aW5jdCgpLAogICAgICAgICAgICAgIGJ5ID0gInN1YmplY3RfaWQiKSAlPiUgCiAgICBmaWx0ZXIoam9pbnRfcHJvYmFiaWxpdHkgPiAwLjAwMSkgJT4lIAogICAgZ3JvdXBfYnkoc3ViamVjdF9pZCkgJT4lIAogICAgbXV0YXRlKHN0YXRlX3BhaXIgPSBmY3RfcmVvcmRlcihzdGF0ZV9wYWlyLCBqb2ludF9wcm9iYWJpbGl0eSkpICU+JQogICAgdW5ncm91cCgpICU+JSAKICAgIGdncGxvdChhZXMoeCA9IGpvaW50X3Byb2JhYmlsaXR5LCAKICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoc3ViamVjdF9pZCwgdG90YWxfcmVjdXJyZW5jZXMpLCAKICAgICAgICAgICAgICAgZmlsbCA9IHN0YXRlX3BhaXIpKSArCiAgICAgIGdlb21fYmFyKHBvc2l0aW9uID0gInN0YWNrIiwgc3RhdCA9ICJpZGVudGl0eSIpICsKICAgICAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICAgICAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAsIDApKSArCiAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbWJpbmVkX3BhbCkgKwogICAgICBsYWJzKHggPSAiSm9pbnQgcHJvYmFiaWxpdHkgZXN0aW1hdGUiLAogICAgICAgICAgIHkgPSAiUGFydGljaXBhbnQiLAogICAgICAgICAgIGZpbGwgPSAiQ2xhc3NpZmljYXRpb24gc3RhdGUiLAogICAgICAgICAgIHN1YnRpdGxlID0gIkkgPSBSZWluZmVjdGlvbiwgTCA9IFJlbGFwc2UsIEMgPSBSZWNydWRlc2NlbmNlIiwKICAgICAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbihpdGFsaWMoIkNvbG9yIGNvZGluZzogaWYgPiAxIHJlY3VycmVuY2UsIGJsdWUgc2hhZGVzIGRlbm90ZSBjb21iaW5hdGlvbnMgb2YgcmVsYXBzZSBhbmQgcmVjcnVkZXNjZW5jZSAoTCBhbmQgQyksIHNoYWRlcyBvZiBvcmFuZ2UvYnJvd25zIGRlbm90ZSBcbmNvbWJvcyBvZiByZWluZmVjdGlvbiBhbmQgcmVsYXBzZSAoSSBhbmQgTCkgYW5kIGdyZWVuIHNoYWRlcyBkZW5vdGUgY29tYm9zIG9mIHJlaW5mZWN0aW9uIHdpdGggcmVjcnVkZXNjZW5jZSAoSSBhbmQgQykiKSkpICsKICAgICAgdGhlbWVfYncoKSArIAogICAgICBmYWNldF93cmFwKGNvbW11bml0eX50b3RhbF9yZWN1cnJlbmNlcywgc2NhbGVzID0gImZyZWUiKSArCiAgICAgICMgZmFjZXRfd3JhcCh0b3RhbF9yZWN1cnJlbmNlc350cmVhdG1lbnRfYXJtLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgICAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgdmp1c3QgPSAtMikpIApgYGAKIyMjICdDb25maWRlbmNlJyBpbiBoaWdoZXN0IGpvaW50IHByb2JhYmlsaXR5IGVzdGltYXRlCldoYXQgaXMgdGhlIGpvaW50IHByb2JhYmlsaXR5IGVzdGltYXRlIGZvciB0aGUgJ2hpZ2hlc3QgcmFua2luZycgc3RhdGUgcGFpciBjbGFzc2lmaWNhdGlvbj8gSS5lLiBpZiA+ODAlIHJlbGF0aXZlbHkgaGlnaCBjb25maWRlbmNlPyBuPTE5CmBgYHtyIHBsb3Qgam9pbnQgcHJvYmFiaWxpdHkgY29uZmlkZW5jZX0Kam9pbnRfc3VtbWFyeSAlPiUgCiAgZmlsdGVyKGpvaW50X3Byb2JhYmlsaXR5ID4gMC4wMDEpICU+JSAKICBncm91cF9ieShzdWJqZWN0X2lkKSAlPiUgCiAgIyBnZXQgdGhlIGhpZ2hlc3QgcHJvYiBmb3IgZWFjaCBzdWJqIGFuZCBzdG9yZSByYW5raW5nCiAgbXV0YXRlKHJhbmtpbmcgPSByYW5rKC1qb2ludF9wcm9iYWJpbGl0eSwgdGllcy5tZXRob2QgPSAiZmlyc3QiKSkgJT4lIAogIGFycmFuZ2Uoc3ViamVjdF9pZCwgcmFua2luZykgJT4lIAogIGZpbHRlcihyYW5raW5nID09IDEpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHN1YmplY3RfaWQsIC1qb2ludF9wcm9iYWJpbGl0eSksCiAgICAgICAgICAgICB5ID0gam9pbnRfcHJvYmFiaWxpdHksCiAgICAgICAgICAgICBmaWxsID0gZmFjdG9yKHRvdGFsX3JlY3VycmVuY2VzKSkpICsKICAgIGdlb21fY29sKCkgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC44LCBjb2xvciA9ICJkYXJrZ3JheSIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAgIGxhYnMoeCA9ICJQYXJ0aWNpcGFudCIsCiAgICAgICAgIHkgPSAiSm9pbnQgcHJvYmFiaWxpdHkgZXN0aW1hdGUgZm9yIGhpZ2hlc3QgJ3JhbmtpbmcnIHN0YXRlIHBhaXIiLAogICAgICAgICBmaWxsID0gIk51bWJlciBvZiByZWN1cnJlbnQgZXBpc29kZXMiLAogICAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbihpdGFsaWMoIkRhc2hlZCBsaW5lIGluZGljYXRlcyBhbiBhcmJpdHJhcnkgdGhyZXNob2xkIG9mIDgwJSIpKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkKYGBgCgpIb3cgbWFueSBzdGF0ZSBwYWlycyBtYWtlIHVwIHRoZSBhcmJpdHJhcnkgODAlIHRocmVzaG9sZD8KYGBge3IgcGxvdCBqb2ludCBwcm9iIGZvciBwYWlyIHJhbmtpbmdzLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQpqb2ludF9zdW1tYXJ5ICU+JSAKICBmaWx0ZXIoam9pbnRfcHJvYmFiaWxpdHkgPiAwLjAwMSkgJT4lIAogIGdyb3VwX2J5KHN1YmplY3RfaWQpICU+JSAKICAjIEdldCB0aGUgaGlnaGVzdCBwcm9iIGZvciBlYWNoIHN1YmplY3QgYW5kIHN0b3JlIHJhbmtpbmcKICBtdXRhdGUocmFua2luZyA9IHJhbmsoLWpvaW50X3Byb2JhYmlsaXR5LCB0aWVzLm1ldGhvZCA9ICJmaXJzdCIpKSAlPiUgCiAgIyByZXZlcnNlIHJhbmtpbmcgb3JkZXIgb2YgcmFua2luZyBzbyB3ZSBwbG90IHRoZSBoaWdoZXN0IHJhbmsgYXQgdGhlIGJvdHRvbQogIGFycmFuZ2Uoc3ViamVjdF9pZCwgZGVzYyhyYW5raW5nKSkgJT4lCiAgbXV0YXRlKHJhbmtpbmcgPSBmYWN0b3IocmFua2luZywgbGV2ZWxzID0gdW5pcXVlKHJhbmtpbmcpKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHN1YmplY3RfaWQsCiAgICAgICAgICAgICB5ID0gam9pbnRfcHJvYmFiaWxpdHksCiAgICAgICAgICAgICBmaWxsID0gcmFua2luZykpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJzdGFjayIpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuOCwgY29sb3IgPSAiZGFya2dyYXkiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgICBzY2FsZV9maWxsX2JyZXdlcih0eXBlID0gInF1YWwiLCAiUGFpcmVkIikgKyAKICAgICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JSYW1wUGFsZXR0ZShicmV3ZXIucGFsKDEyLCAiUGFpcmVkIikpKDE0KSwKICAgICMgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFQpKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwgMCkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgICBsYWJzKHggPSAiUGFydGljaXBhbnQiLAogICAgICAgICB5ID0gIkpvaW50IHByb2JhYmlsaXR5IGVzdGltYXRlIGZvciBzdGF0ZSBwYWlyIiwKICAgICAgICAgZmlsbCA9ICJOdW1iZXIgb2YgcG9zc2libGUgXG5lc3RpbWF0ZWQgc3RhdGUgcGFpcnMiLAogICAgICAgICBjYXB0aW9uID0gZXhwcmVzc2lvbihpdGFsaWMoIkRhc2hlZCBsaW5lIGluZGljYXRlcyBhbiBhcmJpdHJhcnkgdGhyZXNob2xkIG9mIDgwJSIpKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogICAgZmFjZXRfd3JhcCh+dG90YWxfcmVjdXJyZW5jZXMsIHNjYWxlcyA9ICJmcmVlX3giKQpgYGAKCiMjIyBIaWdoZXN0IHJhbmtpbmcgY2xhc3NpZmljYXRpb24gYnkgZXBpc29kZSBudW1iZXIKYGBge3IgY3JlYXRlIHN1bW1hcnkgb2YgdG9wIDMgcmFua2luZ3N9CmpvaW50X3RvcDNfc3VtbWFyeSA8LSBqb2ludF9zdW1tYXJ5ICU+JSAKICAgICAgICAgICAgc2VsZWN0KC1wZXJjZW50YWdlKSAlPiUgCiAgICAgICAgICAgIGdyb3VwX2J5KHN1YmplY3RfaWQpICU+JSAKICAgICAgICAgICAgIyBHZXQgdGhlIGhpZ2hlc3QgcHJvYiBmb3IgZWFjaCBzdWJqZWN0IGFuZCBzdG9yZSByYW5raW5nCiAgICAgICAgICAgIG11dGF0ZShyYW5raW5nID0gcmFuaygtam9pbnRfcHJvYmFiaWxpdHksIHRpZXMubWV0aG9kID0gImZpcnN0IikpICU+JSAKICAgICAgICAgICAgYXJyYW5nZShzdWJqZWN0X2lkLCByYW5raW5nKSAlPiUgCiAgICAgICAgICAgIGZpbHRlcihyYW5raW5nICVpbiUgYygxLCAyLCAzKSkKYGBgCgpXZSB3aWxsIGtlZXAgdGhlICdoaWdoZXN0IHJhbmtpbmcnIGpvaW50IHByb2JhYmlsaXR5IGVzdGltYXRlIHNvIHdlIGNhbiBjb21wYXJlIHRoZSBzdGF0ZSBjbGFzc2lmaWNhdGlvbiBmb3IgZWFjaCBlcGlzb2RlIHdpdGggb3RoZXIgbWV0cmljcwpgYGB7ciBjcmVhdGUgc3VtbWFyeSBvZiB0b3AgcmFua2luZyBqb2ludCBwcm9iYWJpbGl0eSBmb3IgZWFjaCByZWN1cnJlbmNlfQpqb2ludF9yZWN1cnJlbmNlX3N1bW1hcnkgPC0gam9pbnRfdG9wM19zdW1tYXJ5ICU+JSAKICBzZWxlY3QoLXRvdGFsX3JlY3VycmVuY2VzKSAlPiUgCiAgZmlsdGVyKHJhbmtpbmcgPT0gMSkgJT4lIAogIG11dGF0ZShzdGF0ZV9wYWlyX3NwbGl0ID0gc3Ryc3BsaXQoc3RhdGVfcGFpciwgIiIpKSAlPiUgICMgU3BsaXQgc3RhdGVfcGFpciBpbnRvIGluZGl2aWR1YWwgbGV0dGVycwogIHVubmVzdChzdGF0ZV9wYWlyX3NwbGl0KSAlPiUgICMgVW5uZXN0IHRvIGNyZWF0ZSBhIG5ldyByb3cgZm9yIGVhY2ggbGV0dGVyCiAgZ3JvdXBfYnkoc3ViamVjdF9pZCkgJT4lCiAgbXV0YXRlKAogICAgZXBpc29kZV9udW1iZXIgPSByb3dfbnVtYmVyKCkgKyAxLCAgIyBDcmVhdGUgZXBpc29kZSBudW1iZXIgc3RhcnRpbmcgZnJvbSBuKzEgdG8gcmVmbGVjdCBudW1iZXIgb2YgcmVjdXJyZW5jZQogICAgam9pbnRfcHJvYmFiaWxpdHkgPSBqb2ludF9wcm9iYWJpbGl0eSwgICMgS2VlcCB0aGUgc2FtZSBqb2ludF9wcm9iYWJpbGl0eSBmb3IgYWxsIGVwaXNvZGVzXAogICAgc3RhdGVfY2xhc3NpZmljYXRpb24gPSBjYXNlX3doZW4oc3RhdGVfcGFpcl9zcGxpdCA9PSAiTCIgfiAiUmVsYXBzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9wYWlyX3NwbGl0ID09ICJDIiB+ICJSZWNydWRlc2NlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3BhaXJfc3BsaXQgPT0gIkkiIH4gIlJlaW5mZWN0aW9uIikpICU+JQogIHNlbGVjdChzdWJqZWN0X2lkLCBlcGlzb2RlX251bWJlciwgc3RhdGVfY2xhc3NpZmljYXRpb24sIGpvaW50X3Byb2JhYmlsaXR5KQpgYGAKCmBgYHtyIHBsb3Qgam9pbnQgcHJvYiBoaWdoZXN0IHJhbmtpbmcgYnkgZXBpc29kZSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0Kam9pbnRfcmVjdXJyZW5jZV9zdW1tYXJ5ICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoZXBpc29kZV9udW1iZXIpLCB5ID0gam9pbnRfcHJvYmFiaWxpdHksIGZpbGwgPSBzdGF0ZV9jbGFzc2lmaWNhdGlvbikpICsKICAgIGdlb21fY29sKCkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiUmVsYXBzZSIgPSAidHVycXVvaXNlMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWNydWRlc2NlbmNlIiA9ICJza3libHVlNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWluZmVjdGlvbiIgPSAibWFnZW50YTMiKSkgKwogICAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAsIDApKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogICAgbGFicyh4ICAgICA9ICJFcGlzb2RlIG51bWJlciIsIAogICAgICAgICB5ICAgICA9ICJQb3N0ZXJpb3Igam9pbnQgcHJvYmFiaWxpdHkiLCAKICAgICAgICAgZmlsbCA9ICIiKSArIAogICAgdGhlbWVfYncoKSArCiAgICBmYWNldF93cmFwKH5zdWJqZWN0X2lkKQpgYGAKCiMjIENvbXBhcmlzb24gbWFyZ2luYWwgdnMgam9pbnQgCmBgYHtyIGNyZWF0ZSBwb3N0ZXJpb3Igc3VtbWFyeX0KcG9zdGVyaW9yX3N1bW1hcnkgPC0gbWFyZ2luYWxfc3VtbWFyeSAlPiUgCiAgcmVuYW1lKCJtYXJnaW5hbF9wb3N0ZXJpb3JfcHJvYmFiaWxpdHkiID0gInBvc3Rlcmlvcl92YWx1ZSIsCiAgICAgICAgICJtYXJnaW5hbF9jbGFzc2lmaWNhdGlvbiIgPSAicG9zdGVyaW9yX2NsYXNzaWZpY2F0aW9uIikgJT4lIAogIGxlZnRfam9pbihqb2ludF9yZWN1cnJlbmNlX3N1bW1hcnkgJT4lIAogICAgICAgICAgICAgICByZW5hbWUoImpvaW50X2NsYXNzaWZpY2F0aW9uIiA9ICJzdGF0ZV9jbGFzc2lmaWNhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAiam9pbnRfcG9zdGVyaW9yX3Byb2JhYmlsaXR5IiA9ICJqb2ludF9wcm9iYWJpbGl0eSIpLAogICAgICAgICAgICAgYnkgPSBjKCJzdWJqZWN0X2lkIiwgImVwaXNvZGVfbnVtYmVyIikpICU+JSAKICBwaXZvdF9sb25nZXIoY29scyA9IGMobWFyZ2luYWxfcG9zdGVyaW9yX3Byb2JhYmlsaXR5LCAKICAgICAgICAgICAgICAgICAgICAgICAgam9pbnRfcG9zdGVyaW9yX3Byb2JhYmlsaXR5LCAKICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luYWxfY2xhc3NpZmljYXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgICBqb2ludF9jbGFzc2lmaWNhdGlvbiksCiAgICBuYW1lc190byA9IGMoImVzdGltYXRlX3R5cGUiLCAiLnZhbHVlIiksCiAgICBuYW1lc19wYXR0ZXJuID0gIihtYXJnaW5hbHxqb2ludClfKHBvc3Rlcmlvcl9wcm9iYWJpbGl0eXxjbGFzc2lmaWNhdGlvbikiKSAlPiUgCiAgZGlzdGluY3QoKSAKYGBgCgpgYGB7ciBwbG90IG1hcmdpbmFsIHdpdGggam9pbnQgcHJvYnMsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGg9OH0KcG9zdGVyaW9yX3N1bW1hcnkgJT4lIAogIGdyb3VwX2J5KHN1YmplY3RfaWQsIGVwaXNvZGVfbnVtYmVyKSAlPiUKICBhcnJhbmdlKGRlc2MocG9zdGVyaW9yX3Byb2JhYmlsaXR5KSwgLmJ5X2dyb3VwID0gVFJVRSkgJT4lCiAgbXV0YXRlKGNsYXNzaWZpY2F0aW9uID0gZmFjdG9yKGNsYXNzaWZpY2F0aW9uLCBsZXZlbHMgPSB1bmlxdWUoY2xhc3NpZmljYXRpb24pKSkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoZXBpc29kZV9udW1iZXIpLCB5ID0gcG9zdGVyaW9yX3Byb2JhYmlsaXR5LCBncm91cCA9IGVwaXNvZGVfbnVtYmVyKSkgKyAKICAgIGdlb21fYmFyKGRhdGEgPSAuICU+JSBmaWx0ZXIoZXN0aW1hdGVfdHlwZSA9PSAibWFyZ2luYWwiKSwKICAgICAgICAgICAgIGFlcyhmaWxsID0gY2xhc3NpZmljYXRpb24pLAogICAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsIAogICAgICAgICAgICAgcG9zaXRpb24gPSAiZmlsbCIpICsKICAgIGdlb21fc2VnbWVudChkYXRhID0gLiAlPiUgZmlsdGVyKGVzdGltYXRlX3R5cGUgPT0gImpvaW50IiksCiAgICAgICAgICAgICAgIGFlcyh4ID0gYXMubnVtZXJpYyhmYWN0b3IoZXBpc29kZV9udW1iZXIpKSAtIDAuNCwgIAogICAgICAgICAgICAgICAgICAgeGVuZCA9IGFzLm51bWVyaWMoZmFjdG9yKGVwaXNvZGVfbnVtYmVyKSkgKyAwLjQsICAKICAgICAgICAgICAgICAgICAgIHkgPSBwb3N0ZXJpb3JfcHJvYmFiaWxpdHksICAKICAgICAgICAgICAgICAgICAgIHllbmQgPSBwb3N0ZXJpb3JfcHJvYmFiaWxpdHksIAogICAgICAgICAgICAgICAgICAgY29sb3IgPSBjbGFzc2lmaWNhdGlvbiksCiAgICAgICAgICAgICAgIHNpemUgPSAxLjUpICsKICAgIGdlb21fcG9pbnQoZGF0YSA9IC4gJT4lIGZpbHRlcihlc3RpbWF0ZV90eXBlID09ICJqb2ludCIpLAogICAgICAgICAgICAgICBhZXMoY29sb3IgPSBjbGFzc2lmaWNhdGlvbiwKICAgICAgICAgICAgICAgICAgIGZpbGwgPSBjbGFzc2lmaWNhdGlvbiksCiAgICAgICAgICAgICAgIHNoYXBlID0gMjEpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlJlbGFwc2UiID0gInR1cnF1b2lzZTMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVjcnVkZXNjZW5jZSIgPSAic2t5Ymx1ZTQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVpbmZlY3Rpb24iID0gIm1hZ2VudGEzIikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJSZWxhcHNlIiA9ICIjMDA2MDY0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY3J1ZGVzY2VuY2UiID0gIiMzQjRGNzUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVpbmZlY3Rpb24iID0gIiM4QjAwOEIiKSkgKwogICAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAsIDApKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogICAgbGFicyh4ICAgICA9ICJFcGlzb2RlIG51bWJlciIsIAogICAgICAgICB5ICAgICA9ICJQb3N0ZXJpb3IgcHJvYmFiaWxpdHkiLCAKICAgICAgICAgZmlsbCA9ICJNYXJnaW5hbCBjbGFzc2lmaWNhdGlvbiIsCiAgICAgICAgIGNvbG9yID0gIkpvaW50IHByb2JhYmlsaXR5IGVzdGltYXRlIFxuIGFuZCBjbGFzc2lmaWNhdGlvbiIpICsgCiAgICB0aGVtZV9idygpICsKICAgIGZhY2V0X3dyYXAofnN1YmplY3RfaWQpCmBgYAoKIyMgQ29tcGFyaXNvbiB0byBJQlMgYW5kIElCRCBlc3RpbWF0ZXMKYGBge3IgcmVhZCBwbmggYW5kIGliZCBkYXRhfQpwZXJ1X3BuaCA8LSByZWFkLmNzdihoZXJlKCJkYXRhL2ZpbmFsIiwgInBlcnVfUE5IX2RhdGEuY3N2IikpCmliZF9yX2RhdGEgPC0gcmVhZFJEUyhoZXJlKCJkYXRhL2ZpbmFsIiwgInBlcnVfYWxsX21ldGEucmRzIikpCmliZF9yaGF0X2RhdGEgPC0gcmVhZFJEUyhoZXJlKCJkYXRhL2ZpbmFsIiwgInBlcnVfc2lnX21ldGEucmRzIikpCmBgYAoKRm9yIGRpcmVjdCBjb21wYXJpc29uIHdpdGggdGhlIHdlIGNhbiBvbmx5IGxvb2sgYXQgdGhlIHBhaXJlZCBjb21wYXJpc29ucyBiZXR3ZWVuIGJhc2VsaW5lIHNhbXBsZXMgYW5kICdmb2xsb3ctdXAnIHJlY3VycmVudCBzYW1wbGVzLCBidXQgbm90IG90aGVyIHB3IGNvbXBhcmlzb25zIGZvciBhIGdpdmVuIHBhcnRpY2lwYW50LiAKYGBge3IgZmlsdGVyIGRhdGFzZXRzfQpwZXJ1X2liZCA8LSBpYmRfcl9kYXRhICU+JSAKICAgICAgICAgICAgICAjIGZpbHRlciB0byBpbmNsdWRlIG9ubHkgcGFpcmVkIHNhbXBsZXMKICAgICAgICAgICAgICBmaWx0ZXIoY29tcGFyaXNvbl90eXBlID09ICJwYWlyZWQiKSAlPiUgCiAgICAgICAgICAgICAgIyBtZXJnZSB3aXRoIGFuYWx5c2lzX2RhdGEgdG8gZ2V0IHBhdGllbnRfbmFtZSBhbmQgJ2RheScgaW5mbwogICAgICAgICAgICAgIGxlZnRfam9pbihhbmFseXNpc19kYXRhICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Qoc2FtcGxlX2lkLCBzdWJqZWN0X2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gZGF5c19zaW5jZV9lbnJvbG1lbnQpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdCgpLAogICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoInNhbXBsZWlkMSIgPSAic2FtcGxlX2lkIikpICU+JSAKICAgICAgICAgICAgICByZW5hbWUoInN1YmplY3RfaWQxIiA9ICJzdWJqZWN0X2lkIiwKICAgICAgICAgICAgICAgICAgICAgImRheV9pZDEiID0gImRheSIpICU+JSAKICAgICAgICAgICAgICAjIGRvIHRoZSBzYW1lIGZvciBzYW1wbGUgaWQgMiBpbiBwYWlyIC0gbWVyZ2Ugd2l0aCBhbmFseXNpc19kYXRhIHRvIGdldCBwYXRpZW50X25hbWUgYW5kICdkYXknIGluZm8KICAgICAgICAgICAgICBsZWZ0X2pvaW4oYW5hbHlzaXNfZGF0YSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHNhbXBsZV9pZCwgc3ViamVjdF9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheSA9IGRheXNfc2luY2VfZW5yb2xtZW50KSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKSwKICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGVpZDIiID0gInNhbXBsZV9pZCIpKSAlPiUgCiAgICAgICAgICAgICAgcmVuYW1lKCJkYXlfaWQyIiA9ICJkYXkiKSAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KC1zdWJqZWN0X2lkMSkgJT4lIAogICAgICAgICAgICAgICMgZmlsdGVyIHRvIGluY2x1ZGUgb25seSBwdyBjb21wYXJpc29ucyB0byBmaXJzdCBlcGlzb2RlIGluIHN0dWR5IHBlcmlvZAogICAgICAgICAgICAgIGZpbHRlcihkYXlfaWQyID09ICIwIikgJT4lIAogICAgICAgICAgICAgIGdyb3VwX2J5KHN1YmplY3RfaWQpICU+JSAgCiAgICAgICAgICAgICAgYXJyYW5nZShkYXRlMSkgJT4lICAKICAgICAgICAgICAgICAjIGNyZWF0ZSBlcGlzb2RlX251bWJlciBhY2NvdW50aW5nIGZvciBiYXNlbGluZSBhcyBlcGlzb2RlIDEKICAgICAgICAgICAgICBtdXRhdGUoZXBpc29kZV9udW1iZXIgPSByb3dfbnVtYmVyKCkgKyAxKSAlPiUgCiAgICAgICAgICAgICAgdW5ncm91cCgpCmBgYAoKYGBge3IgY2xhc3NpZmljYXRpb24gc3VtbWFyeX0KY2xhc3NpZmljYXRpb25fc3VtbWFyeSA8LSBpbmRpdl9wb3N0ZXJpb3JzX21hcmdpbmFsICU+JSAKICByZW5hbWUoInBvc3Rlcmlvcl9wcm9iYWJpbGl0eV9yZWNydWRlc2NlbmNlIiA9ICJQb3N0ZXJpb3JfbWFyZ2luYWxfcHJvYl9DIiwKICAgICAgICAgInBvc3Rlcmlvcl9wcm9iYWJpbGl0eV9yZWxhcHNlIiA9ICJQb3N0ZXJpb3JfbWFyZ2luYWxfcHJvYl9MIiwKICAgICAgICAgInBvc3Rlcmlvcl9wcm9iYWJpbGl0eV9yZWluZmVjdGlvbiIgPSAiUG9zdGVyaW9yX21hcmdpbmFsX3Byb2JfSSIpICU+JSAKICAjIG1lcmdlIHdpdGggZXBpIHZhcmlhYmxlcwogIGxlZnRfam9pbihhbmFseXNpc19kYXRhICU+JSBzZWxlY3Qoc3ViamVjdF9pZCwgc2FtcGxlX2lkLCBlcGlzb2RlX251bWJlciwgY29tbXVuaXR5LCB2aXNpdF9kYXRlLCBkYXlzX3NpbmNlX2Vucm9sbWVudCwgZGF5c19zaW5jZV9sYXN0X2VwaXNvZGUpICU+JSBkaXN0aW5jdCgpLCAKICAgICAgICAgICAgYnkgPSBjKCJzdWJqZWN0X2lkIiwgImVwaXNvZGVfbnVtYmVyIikpICU+JSAKICAjIG1lcmdlIHdpdGggUE5IIGRhdGEKICBsZWZ0X2pvaW4ocGVydV9wbmgsCiAgICAgICAgICAgIGJ5ID0gYygic3ViamVjdF9pZCIgPSAiUGF0aWVudCIsIAogICAgICAgICAgICAgICAgICAgImVwaXNvZGVfbnVtYmVyIiA9ICJyZWN1cnJlbmNlIikpICU+JSAKICByZW5hbWUoInByb3Bfc2FtZV9oYXBzXzFtaW51c1BOSCIgPSAiUHJvcF9oZXQiLCAKICAgICAgICAgInBuaF9yYW5nZSIgPSAiaWRlbnRpdHkiLCAKICAgICAgICAgImNsYXNzaWZpY2F0aW9uIiA9ICJDbGFzc2lmaWNhdGlvbiIpICU+JSAKICAjIGNyZWF0ZSBiaW5zIGZvciAxLVBOSCAoSUJTIG1ldHJpYykKICBtdXRhdGUoaWJzX3JhbmdlID0gY3V0KHByb3Bfc2FtZV9oYXBzXzFtaW51c1BOSCwgIAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAwLjI1LCAwLjUsIDAuNzUsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwLTAuMjUiLCAiMC4yNS0wLjUiLCAiMC41LTAuNzUiLCAiMC43NS0xIikpKSAlPiUgCiAgIyBtZXJnZSB3aXRoIElCRCBkYXRhCiAgbGVmdF9qb2luKHBlcnVfaWJkLAogICAgICAgICAgICBieSA9IGMoInN1YmplY3RfaWQiLCAiZXBpc29kZV9udW1iZXIiKSkgJT4lIAogICMgY3JlYXRlIGJpbnMgZm9yIElCRAogIG11dGF0ZShpYmRfcmFuZ2UgPSBjdXQoZXN0aW1hdGUsICAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMC4yNSwgMC41LCAwLjc1LCAxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMC0wLjI1IiwgIjAuMjUtMC41IiwgIjAuNS0wLjc1IiwgIjAuNzUtMSIpKSkgJT4lIAogICMgbWVyZ2Ugd2l0aCBqb2ludCBwcm9iYWJpbGl0aWVzCiAgbGVmdF9qb2luKGpvaW50X3JlY3VycmVuY2Vfc3VtbWFyeSAlPiUgCiAgICAgICAgICAgICAgcmVuYW1lKCJqb2ludF9jbGFzc2lmaWNhdGlvbiIgPSAic3RhdGVfY2xhc3NpZmljYXRpb24iKSwKICAgICAgICAgICAgYnkgPSBjKCJzdWJqZWN0X2lkIiwgImVwaXNvZGVfbnVtYmVyIikpCgpjbGFzc2lmaWNhdGlvbl9zdW1tYXJ5CmBgYAoKIyMjIENvbXBhcmlzb24gd2l0aCBJQlMKYGBge3IgY2xhc3NpZmljYXRpb24gY29tcGFyaXNvbiB3aXRoIElCUywgZXZhbD1GfQpjbGFzc2lmaWNhdGlvbl9zdW1tYXJ5ICU+JSAKICBzZWxlY3Qoc3ViamVjdF9pZCwgc2FtcGxlX2lkLCBlcGlzb2RlX251bWJlciwgdmlzaXRfZGF0ZSwgZGF5c19zaW5jZV9lbnJvbG1lbnQsIGRheXNfc2luY2VfbGFzdF9lcGlzb2RlLCBzdGFydHNfd2l0aCgicG9zdGVyaW9yXyIpLCBwcm9wX3NhbWVfaGFwc18xbWludXNQTkgsIHBuaF9yYW5nZSwgaWJzX3JhbmdlLCBjbGFzc2lmaWNhdGlvbikgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gKHN0YXJ0c193aXRoKCJwb3N0ZXJpb3IiKSksIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJwb3N0ZXJpb3JfdHlwZSIsIAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicG9zdGVyaW9yX3ZhbHVlIikgJT4lIAogIG11dGF0ZShwb3N0ZXJpb3JfcmFuZ2UgPSBjdXQocG9zdGVyaW9yX3ZhbHVlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMC4yNSwgMC41LCAwLjc1LCAxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMC0wLjI1IiwgIjAuMjUtMC41IiwgIjAuNS0wLjc1IiwgIjAuNzUtMSIpKSkgJT4lIAogIGNvdW50KGlic19yYW5nZSwgY2xhc3NpZmljYXRpb24sIHBvc3Rlcmlvcl90eXBlLCBwb3N0ZXJpb3JfcmFuZ2UpCmBgYAoKIyMjIFBsb3QgSUJTIHJhbmdlIHZzIHByb2JhYmlsaXN0aWMgY2xhc3NpZmljYXRpb24gKG1hcmdpbmFsIHByb2JhYmlsaXR5KQpgYGB7ciBjbGFzc2lmaWNhdGlvbiBJQlMgY29tcGFyaXNvbiBwbG90IHYgbWFyZ2luYWwsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD04fQpjbGFzc2lmaWNhdGlvbl9zdW1tYXJ5ICU+JSAKICBzZWxlY3Qoc3ViamVjdF9pZCwgc2FtcGxlX2lkLCBwYWlyLCBlcGlzb2RlX251bWJlciwgdmlzaXRfZGF0ZSwgZGF5c19zaW5jZV9lbnJvbG1lbnQsIGRheXNfc2luY2VfbGFzdF9lcGlzb2RlLCBzdGFydHNfd2l0aCgicG9zdGVyaW9yXyIpLCBwcm9wX3NhbWVfaGFwc18xbWludXNQTkgsIHBuaF9yYW5nZSwgaWJzX3JhbmdlLCBjbGFzc2lmaWNhdGlvbikgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gKHN0YXJ0c193aXRoKCJwb3N0ZXJpb3IiKSksIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJwb3N0ZXJpb3JfdHlwZSIsIAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicG9zdGVyaW9yX3ZhbHVlIikgJT4lIAogIG11dGF0ZShwb3N0ZXJpb3JfcmFuZ2UgPSBjdXQocG9zdGVyaW9yX3ZhbHVlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMC4yNSwgMC41LCAwLjc1LCAxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMC0wLjI1IiwgIjAuMjUtMC41IiwgIjAuNS0wLjc1IiwgIjAuNzUtMSIpKSkgJT4lICAKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHBhaXIsIGVwaXNvZGVfbnVtYmVyKSwgeSA9IHBvc3Rlcmlvcl92YWx1ZSwgZ3JvdXAgPSBlcGlzb2RlX251bWJlciwgZmlsbCA9IHBvc3Rlcmlvcl90eXBlKSkgKwogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJ0dXJxdW9pc2UzIiwgIm1hZ2VudGEzIiwgInNreWJsdWU0IiksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicG9zdGVyaW9yX3Byb2JhYmlsaXR5X3JlbGFwc2UiID0gIlJlbGFwc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3Rlcmlvcl9wcm9iYWJpbGl0eV9yZWNydWRlc2NlbmNlIiA9ICJSZWNydWRlc2NlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0ZXJpb3JfcHJvYmFiaWxpdHlfcmVpbmZlY3Rpb24iID0gIlJlaW5mZWN0aW9uIikpICsKICAgIHNjYWxlX3hfZGlzY3JldGUoZXhwYW5kID0gYygwLCAwKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICAgIGxhYnMoeCAgICAgPSAiU2FtcGxlIiwgCiAgICAgICAgIHkgICAgID0gIlBvc3RlcmlvciBwcm9iYWJpbGl0eSIsIAogICAgICAgICBmaWxsID0gIiIpICsgCiAgICB0aGVtZV9idygpICsKICAgIGZhY2V0X3dyYXAofmlic19yYW5nZSwgc2NhbGVzID0gImZyZWVfeCIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKQpgYGAKIyMjIFBsb3QgSUJTIHJhbmdlIHZzIHByb2JhYmlsaXN0aWMgY2xhc3NpZmljYXRpb24gKGpvaW50IHByb2JhYmlsaXR5LCBoaWdoZXN0IHJhbmtpbmcpCmBgYHtyIGNsYXNzaWZpY2F0aW9uIElCUyBjb21wYXJpc29uIHBsb3QgdiBqb2ludCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTh9CmNsYXNzaWZpY2F0aW9uX3N1bW1hcnkgJT4lIAogIHNlbGVjdChzdWJqZWN0X2lkLCBzYW1wbGVfaWQsIHBhaXIsIGVwaXNvZGVfbnVtYmVyLCB2aXNpdF9kYXRlLCBkYXlzX3NpbmNlX2Vucm9sbWVudCwgZGF5c19zaW5jZV9sYXN0X2VwaXNvZGUsIHN0YXJ0c193aXRoKCJqb2ludCIpLCBwcm9wX3NhbWVfaGFwc18xbWludXNQTkgsIHBuaF9yYW5nZSwgaWJzX3JhbmdlLCBjbGFzc2lmaWNhdGlvbikgJT4lIAogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocGFpciwgZXBpc29kZV9udW1iZXIpLCB5ID0gam9pbnRfcHJvYmFiaWxpdHksIGdyb3VwID0gZXBpc29kZV9udW1iZXIsIGZpbGwgPSBqb2ludF9jbGFzc2lmaWNhdGlvbikpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJSZWxhcHNlIiA9ICJ0dXJxdW9pc2UzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY3J1ZGVzY2VuY2UiID0gInNreWJsdWU0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlaW5mZWN0aW9uIiA9ICJtYWdlbnRhMyIpKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwgMCkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgICBsYWJzKHggICAgID0gIlNhbXBsZSBwYWlyIiwgCiAgICAgICAgIHkgICAgID0gIlBvc3RlcmlvciBqb2ludCBwcm9iYWJpbGl0eSAoaGlnaGVzdCByYW5raW5nIGNsYXNzaWZpY2F0aW9uKSIsIAogICAgICAgICBmaWxsID0gIiIpICsgCiAgICB0aGVtZV9idygpICsKICAgIGZhY2V0X3dyYXAofmlic19yYW5nZSwgc2NhbGVzID0gImZyZWVfeCIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKQpgYGAKCiMjIyBDb21wYXJpc29uIHdpdGggSUJECmBgYHtyIGNsYXNzaWZpY2F0aW9uIGNvbXBhcmlzb24gd2l0aCBJQkQsIGV2YWw9Rn0KY2xhc3NpZmljYXRpb25fc3VtbWFyeSAlPiUgCiAgc2VsZWN0KHN1YmplY3RfaWQsIHNhbXBsZV9pZCwgZXBpc29kZV9udW1iZXIsIHZpc2l0X2RhdGUsIGRheXNfc2luY2VfZW5yb2xtZW50LCBkYXlzX3NpbmNlX2xhc3RfZXBpc29kZSwgc3RhcnRzX3dpdGgoInBvc3Rlcmlvcl8iKSwgaWJkX3JhbmdlLCBDSV9sb3dlciwgQ0lfdXBwZXIsIHNpZ19lc3QpICU+JSAKICBwaXZvdF9sb25nZXIoY29scyA9IChzdGFydHNfd2l0aCgicG9zdGVyaW9yIikpLCAKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAicG9zdGVyaW9yX3R5cGUiLCAKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInBvc3Rlcmlvcl92YWx1ZSIpICU+JSAKICBtdXRhdGUocG9zdGVyaW9yX3JhbmdlID0gY3V0KHBvc3Rlcmlvcl92YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDAuMjUsIDAuNSwgMC43NSwgMSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjAtMC4yNSIsICIwLjI1LTAuNSIsICIwLjUtMC43NSIsICIwLjc1LTEiKSkpICU+JSAKICBjb3VudChpYmRfcmFuZ2UsIHNpZ19lc3QsIHBvc3Rlcmlvcl90eXBlLCBwb3N0ZXJpb3JfcmFuZ2UpCmBgYAoKIyMjIEZvciByZWZlcmVuY2UgLSBhbGwgcGFpcndpc2UgY29tcGFyaXNvbnMKYGBge3IgcGxvdCBlc3RpbWF0ZXMgYW5kIENJIGFsbCBwdyBjb21wYXJpc29ucywgZmlnLmhlaWdodD0xNiwgZmlnLndpZHRoPTEwfQppYmRfcl9kYXRhICU+JSAKICBmaWx0ZXIoY29tcGFyaXNvbl90eXBlID09ICJwYWlyZWQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcGFpciwgeSA9IGVzdGltYXRlLCBncm91cCA9IHBhdGllbnRpZDEsIGNvbG9yID0gc2lnX2VzdCkpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBDSV9sb3dlciwgeW1heCA9IENJX3VwcGVyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIm5vdCBzaWduaWZpY2FudCIgPSAiZGFya2dyZXkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWduaWZpY2FudCIgPSAiaW5kaWFucmVkMyIpKSArCiAgICBmYWNldF93cmFwKH5wYXRpZW50aWQxLCBzY2FsZXMgPSAiZnJlZV94IikgKwogICAgdGhlbWVfYncoKSArICAgIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKQpgYGAKCiMjIyBQbG90IElCRCBlc3RpbWF0ZSBhbmQgQ0kgZm9yIHBhaXJlZCBzYW1wbGVzIGNvbXBhcmVkIHRvIGJhc2VsaW5lIGZvciBlYWNoIHBhcnRpY2lwYW50CmBgYHtyIHBsb3QgZXN0aW1hdGVzIGFuZCBDSSBwYWlyZWQgc2FtcGxlcywgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9CmNsYXNzaWZpY2F0aW9uX3N1bW1hcnkgJT4lIAogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoc2FtcGxlaWQxLCBkYXlzX3NpbmNlX2Vucm9sbWVudCksIHkgPSBlc3RpbWF0ZSwgZ3JvdXAgPSBzdWJqZWN0X2lkLCBjb2xvciA9IHNpZ19lc3QpKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gQ0lfbG93ZXIsIHltYXggPSBDSV91cHBlcikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJub3Qgc2lnbmlmaWNhbnQiID0gImRhcmtncmV5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lnbmlmaWNhbnQiID0gImluZGlhbnJlZDMiKSkgKwogICAgbGFicyh4ID0gIlNhbXBsZSIsCiAgICAgICAgIHkgPSAiSUJEIiwKICAgICAgICAgY29sb3IgPSAiU2lnbmlmaWNhbmNlIikgKwogICAgZmFjZXRfd3JhcCh+c3ViamVjdF9pZCwgc2NhbGVzID0gImZyZWVfeCIpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpCmBgYAoKYGBge3IgcGxvdCBlc3RpbWF0ZXMgYW5kIENJIG5vdCBwYWlyZWQgc2FtcGxlcywgZXZhbD1GfQppYmRfcl9kYXRhICU+JSAKICBmaWx0ZXIoY29tcGFyaXNvbl90eXBlID09ICJub3QgcGFpcmVkIikgJT4lIAogIGdncGxvdChhZXMoeCA9IHBhaXIsIHkgPSBlc3RpbWF0ZSwgZ3JvdXAgPSBwYXRpZW50aWQxLCBjb2xvciA9IHNpZ19lc3QpKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gQ0lfbG93ZXIsIHltYXggPSBDSV91cHBlcikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJub3Qgc2lnbmlmaWNhbnQiID0gImRhcmtncmV5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lnbmlmaWNhbnQiID0gImluZGlhbnJlZDMiKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkKYGBgCgojIyMgUGxvdCBJQkQgZXN0aW1hdGUgYW5kIENJIGZvciBwYWlyZWQgc2FtcGxlcyBjb21wYXJlZCB0byBiYXNlbGluZSBmb3IgZWFjaCBwYXJ0aWNpcGFudCwgYmFzZWQgb24gZGF5cyBzaW5jZSBsYXN0IGVwaXNvZGUKUGVyaGFwcyByZWluZmVjdGlvbnMgYXJlIG1vcmUgbGlrZWx5IHRvIG9jY3VyIGFmdGVyIG1vcmUgdGltZT8KYGBge3IgcGxvdCBlc3RpbWF0ZXMgYW5kIENJIHBhaXJlZCBzYW1wbGVzIHYgZGF5cywgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTh9CmNsYXNzaWZpY2F0aW9uX3N1bW1hcnkgJT4lIAogIGdncGxvdChhZXMoeCA9IGRheXNfc2luY2VfbGFzdF9lcGlzb2RlLCB5ID0gZXN0aW1hdGUsIGdyb3VwID0gc3ViamVjdF9pZCwgY29sb3IgPSBzaWdfZXN0KSkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMykgKwogICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IENJX2xvd2VyLCB5bWF4ID0gQ0lfdXBwZXIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygibm90IHNpZ25pZmljYW50IiA9ICJkYXJrZ3JleSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25pZmljYW50IiA9ICJpbmRpYW5yZWQzIikpICsKICAgIGxhYnMoeCA9ICJEYXlzIHNpbmNlIGxhc3QgZXBpc29kZSIsCiAgICAgICAgIHkgPSAiSUJEIiwKICAgICAgICAgZmlsbCA9ICJTaWduaWZpY2FuY2UiKSArCiAgICBmYWNldF93cmFwKH5zdWJqZWN0X2lkLCBzY2FsZXMgPSAiZnJlZV94IikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkKYGBgCgojIyMgUGxvdCBJQkQgcmFuZ2UgdnMgcHJvYmFiaWxpc3RpYyBjbGFzc2lmaWNhdGlvbiAobWFyZ2luYWwpCmBgYHtyIGNsYXNzaWZpY2F0aW9uIElCRCBjb21wYXJpc29uIHBsb3QsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD04fQpjbGFzc2lmaWNhdGlvbl9zdW1tYXJ5ICU+JSAKICBzZWxlY3Qoc3ViamVjdF9pZCwgc2FtcGxlX2lkLCBwYWlyLCBlcGlzb2RlX251bWJlciwgdmlzaXRfZGF0ZSwgZGF5c19zaW5jZV9lbnJvbG1lbnQsIGRheXNfc2luY2VfbGFzdF9lcGlzb2RlLCBzdGFydHNfd2l0aCgicG9zdGVyaW9yXyIpLCBpYmRfcmFuZ2UsIENJX2xvd2VyLCBDSV91cHBlciwgc2lnX2VzdCkgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gKHN0YXJ0c193aXRoKCJwb3N0ZXJpb3IiKSksIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJwb3N0ZXJpb3JfdHlwZSIsIAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicG9zdGVyaW9yX3ZhbHVlIikgJT4lIAogIG11dGF0ZShwb3N0ZXJpb3JfcmFuZ2UgPSBjdXQocG9zdGVyaW9yX3ZhbHVlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMC4yNSwgMC41LCAwLjc1LCAxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMC0wLjI1IiwgIjAuMjUtMC41IiwgIjAuNS0wLjc1IiwgIjAuNzUtMSIpKSkgJT4lICAKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHBhaXIsIGVwaXNvZGVfbnVtYmVyKSwgeSA9IHBvc3Rlcmlvcl92YWx1ZSwgZ3JvdXAgPSBlcGlzb2RlX251bWJlciwgZmlsbCA9IHBvc3Rlcmlvcl90eXBlKSkgKwogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJ0dXJxdW9pc2UzIiwgIm1hZ2VudGEzIiwgInNreWJsdWU0IiksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicG9zdGVyaW9yX3Byb2JhYmlsaXR5X3JlbGFwc2UiID0gIlJlbGFwc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3Rlcmlvcl9wcm9iYWJpbGl0eV9yZWNydWRlc2NlbmNlIiA9ICJSZWNydWRlc2NlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0ZXJpb3JfcHJvYmFiaWxpdHlfcmVpbmZlY3Rpb24iID0gIlJlaW5mZWN0aW9uIikpICsKICAgIGxhYnMoeCAgICAgPSAiU2FtcGxlIHBhaXIiLCAKICAgICAgICAgeSAgICAgPSAiUG9zdGVyaW9yIHByb2JhYmlsaXR5IiwgCiAgICAgICAgIGZpbGwgPSAiIikgKyAKICAgIHRoZW1lX2J3KCkgKwogICAgZmFjZXRfd3JhcCh+aWJkX3JhbmdlLCBzY2FsZXMgPSAiZnJlZV94IikgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpCmBgYAoKIyMjIFBsb3QgSUJEIHJhbmdlIHZzIHByb2JhYmlsaXN0aWMgY2xhc3NpZmljYXRpb24gKGpvaW50IHByb2JhYmlsaXR5LCBoaWdoZXN0IHJhbmtpbmcpCmBgYHtyIGNsYXNzaWZpY2F0aW9uIElCRCBjb21wYXJpc29uIHBsb3QgdiBqb2ludCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTh9CmNsYXNzaWZpY2F0aW9uX3N1bW1hcnkgJT4lIAogIHNlbGVjdChzdWJqZWN0X2lkLCBzYW1wbGVfaWQsIHBhaXIsIGVwaXNvZGVfbnVtYmVyLCB2aXNpdF9kYXRlLCBkYXlzX3NpbmNlX2Vucm9sbWVudCwgZGF5c19zaW5jZV9sYXN0X2VwaXNvZGUsIHN0YXJ0c193aXRoKCJqb2ludCIpLCBpYmRfcmFuZ2UsIENJX2xvd2VyLCBDSV91cHBlciwgc2lnX2VzdCkgJT4lIAogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocGFpciwgZXBpc29kZV9udW1iZXIpLCB5ID0gam9pbnRfcHJvYmFiaWxpdHksIGdyb3VwID0gZXBpc29kZV9udW1iZXIsIGZpbGwgPSBqb2ludF9jbGFzc2lmaWNhdGlvbikpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJSZWxhcHNlIiA9ICJ0dXJxdW9pc2UzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlY3J1ZGVzY2VuY2UiID0gInNreWJsdWU0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlaW5mZWN0aW9uIiA9ICJtYWdlbnRhMyIpKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwgMCkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgICBsYWJzKHggICAgID0gIlNhbXBsZSBwYWlyIiwgCiAgICAgICAgIHkgICAgID0gIlBvc3RlcmlvciBqb2ludCBwcm9iYWJpbGl0eSAoaGlnaGVzdCByYW5raW5nIGNsYXNzaWZpY2F0aW9uKSIsIAogICAgICAgICBmaWxsID0gIiIpICsgCiAgICB0aGVtZV9idygpICsKICAgIGZhY2V0X3dyYXAofmliZF9yYW5nZSwgc2NhbGVzID0gImZyZWVfeCIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKQpgYGAKCiMjIENvbmZ1c2lvbiBtYXRyaWNlczogUE5IIHZzIHByb2JhYmlsaXN0aWMgY2xhc3NpZmljYXRpb24KCiMjIyBDbGFzc2lmaWNhdGlvbiBieSAxLVBOSCAoSUJTKSByYW5nZQpgYGB7ciBkYXRhIGZvciBjb25mdXNpb24gbWF0cml4IGlicyByYW5nZX0KY29uZnVzaW9uX2RhdGFfaWJzcmFuZ2UgPC0gY2xhc3NpZmljYXRpb25fc3VtbWFyeSAlPiUgCiAgc2VsZWN0KHN1YmplY3RfaWQsIHNhbXBsZV9pZCwgZXBpc29kZV9udW1iZXIsIHZpc2l0X2RhdGUsIGRheXNfc2luY2VfZW5yb2xtZW50LCBkYXlzX3NpbmNlX2xhc3RfZXBpc29kZSwgc3RhcnRzX3dpdGgoInBvc3Rlcmlvcl8iKSwgc3RhcnRzX3dpdGgoImpvaW50IiksIHByb3Bfc2FtZV9oYXBzXzFtaW51c1BOSCwgcG5oX3JhbmdlLCBpYnNfcmFuZ2UsIAogICAgICAgICAjIHJlbmFtaW5nIGZvciBjbGFyaXR5CiAgICAgICAgIHBuaF9jbGFzc2lmaWNhdGlvbiA9IGNsYXNzaWZpY2F0aW9uKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAoc3RhcnRzX3dpdGgoInBvc3RlcmlvciIpKSwgCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIm1hcmdpbmFsX2NsYXNzaWZpY2F0aW9uIiwgCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJtYXJnaW5hbF9wcm9iYWJpbGl0eSIpICU+JSAKICBtdXRhdGUobWFyZ2luYWxfY2xhc3NpZmljYXRpb24gPSBjYXNlX3doZW4obWFyZ2luYWxfY2xhc3NpZmljYXRpb24gPT0gInBvc3Rlcmlvcl9wcm9iYWJpbGl0eV9yZWNydWRlc2NlbmNlIiB+ICJSZWNydWRlc2NlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luYWxfY2xhc3NpZmljYXRpb24gPT0gInBvc3Rlcmlvcl9wcm9iYWJpbGl0eV9yZWxhcHNlIiB+ICJSZWxhcHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luYWxfY2xhc3NpZmljYXRpb24gPT0gInBvc3Rlcmlvcl9wcm9iYWJpbGl0eV9yZWluZmVjdGlvbiIgfiAiUmVpbmZlY3Rpb24iKSwKICAgICAgICAgbWFyZ2luYWxfY2xhc3NpZmljYXRpb24gPSBmYWN0b3IobWFyZ2luYWxfY2xhc3NpZmljYXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJSZWxhcHNlIiwgIlJlY3J1ZGVzY2VuY2UiLCAiUmVpbmZlY3Rpb24iKSksCiAgICAgICAgIG1hcmdpbmFsX3Byb2JhYmlsaXR5X3JhbmdlID0gY3V0KG1hcmdpbmFsX3Byb2JhYmlsaXR5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAwLjI1LCAwLjUsIDAuNzUsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMC0wLjI1IiwgIjAuMjUtMC41IiwgIjAuNS0wLjc1IiwgIjAuNzUtMSIpKSwKICAgICAgICAgam9pbnRfcHJvYmFiaWxpdHlfcmFuZ2UgPSBjdXQoam9pbnRfcHJvYmFiaWxpdHksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDAuMjUsIDAuNSwgMC43NSwgMSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwLTAuMjUiLCAiMC4yNS0wLjUiLCAiMC41LTAuNzUiLCAiMC43NS0xIikpKSAlPiUgCiAgc2VsZWN0KHN1YmplY3RfaWQsIGVwaXNvZGVfbnVtYmVyLCBkYXlzX3NpbmNlX2Vucm9sbWVudCwgaWJzX3JhbmdlLCBwbmhfY2xhc3NpZmljYXRpb24sICBtYXJnaW5hbF9jbGFzc2lmaWNhdGlvbiwgbWFyZ2luYWxfcHJvYmFiaWxpdHksIG1hcmdpbmFsX3Byb2JhYmlsaXR5X3JhbmdlLCBqb2ludF9jbGFzc2lmaWNhdGlvbiwgam9pbnRfcHJvYmFiaWxpdHksIGpvaW50X3Byb2JhYmlsaXR5X3JhbmdlKSAlPiUgCiAgIyBub3cgb25seSBrZWVwIHRoZSBoaWdoZXN0ICdyYW5raW5nJyBtYXJnaW5hbCBjbGFzc2lmaWNhdGlvbgogIGdyb3VwX2J5KHN1YmplY3RfaWQsIGVwaXNvZGVfbnVtYmVyKSAlPiUgCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWFyZ2luYWxfcHJvYmFiaWxpdHksIG4gPSAxLCB3aXRoX3RpZXMgPSBGKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBncm91cF9ieShpYnNfcmFuZ2UsIG1hcmdpbmFsX2NsYXNzaWZpY2F0aW9uLCBqb2ludF9jbGFzc2lmaWNhdGlvbikgJT4lCiAgdGFsbHkoKSAlPiUKICBkY2FzdChpYnNfcmFuZ2UgfiBtYXJnaW5hbF9jbGFzc2lmaWNhdGlvbiArIGpvaW50X2NsYXNzaWZpY2F0aW9uLCB2YWx1ZS52YXIgPSAibiIsIGZpbGwgPSAwKQpgYGAKCmBgYHtyIHBsb3QgY29uZnVzaW9uIG1hdHJpeCBpYnMgcmFuZ2V9CmNvbmZ1c2lvbl9kYXRhX2lic3JhbmdlICU+JSAKICBtZWx0KGlkLnZhcnMgPSAiaWJzX3JhbmdlIikgJT4lIAogIGdncGxvdChhZXMoaWJzX3JhbmdlLCB2YXJpYWJsZSwgZmlsbCA9IHZhbHVlKSkgKwogICAgZ2VvbV90aWxlKCkgKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gInJlZCIpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSB2YWx1ZSkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICBsYWJzKHggPSAiSUJTIHJhbmdlICgxLVBOSCkiLAogICAgICAgICB5ID0gIk1hcmdpbmFsIHZzIGpvaW50IGNsYXNzaWZpY2F0aW9uIiwKICAgICAgICAgZmlsbCA9ICJDb3VudCIpCmBgYAoKIyMjIENsYXNzaWZpY2F0aW9uIGNvbXBhcmlzb24KYGBge3IgZGF0YSBmb3IgY29uZnVzaW9uIG1hdHJpeCBwbmggc3RhdGV9CiMgQ3JlYXRlIGEgY29uZnVzaW9uIG1hdHJpeCBmb3IgZWFjaCBwYWlyCmNvbmZ1c2lvbl9kYXRhX3BuaHN0YXRlIDwtIAogIGNsYXNzaWZpY2F0aW9uX3N1bW1hcnkgJT4lIAogIHNlbGVjdChzdWJqZWN0X2lkLCBzYW1wbGVfaWQsIGVwaXNvZGVfbnVtYmVyLCB2aXNpdF9kYXRlLCBkYXlzX3NpbmNlX2Vucm9sbWVudCwgZGF5c19zaW5jZV9sYXN0X2VwaXNvZGUsIHN0YXJ0c193aXRoKCJwb3N0ZXJpb3JfIiksIHN0YXJ0c193aXRoKCJqb2ludCIpLCBwcm9wX3NhbWVfaGFwc18xbWludXNQTkgsIHBuaF9yYW5nZSwgaWJzX3JhbmdlLCAKICAgICAgICAgIyByZW5hbWluZyBmb3IgY2xhcml0eQogICAgICAgICBwbmhfY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmaWNhdGlvbikgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gKHN0YXJ0c193aXRoKCJwb3N0ZXJpb3IiKSksIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJtYXJnaW5hbF9jbGFzc2lmaWNhdGlvbiIsIAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAibWFyZ2luYWxfcHJvYmFiaWxpdHkiKSAlPiUgCiAgbXV0YXRlKG1hcmdpbmFsX2NsYXNzaWZpY2F0aW9uID0gY2FzZV93aGVuKG1hcmdpbmFsX2NsYXNzaWZpY2F0aW9uID09ICJwb3N0ZXJpb3JfcHJvYmFiaWxpdHlfcmVjcnVkZXNjZW5jZSIgfiAiUmVjcnVkZXNjZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbmFsX2NsYXNzaWZpY2F0aW9uID09ICJwb3N0ZXJpb3JfcHJvYmFiaWxpdHlfcmVsYXBzZSIgfiAiUmVsYXBzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbmFsX2NsYXNzaWZpY2F0aW9uID09ICJwb3N0ZXJpb3JfcHJvYmFiaWxpdHlfcmVpbmZlY3Rpb24iIH4gIlJlaW5mZWN0aW9uIiksCiAgICAgICAgIG1hcmdpbmFsX2NsYXNzaWZpY2F0aW9uID0gZmFjdG9yKG1hcmdpbmFsX2NsYXNzaWZpY2F0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiUmVsYXBzZSIsICJSZWNydWRlc2NlbmNlIiwgIlJlaW5mZWN0aW9uIikpLAogICAgICAgICBtYXJnaW5hbF9wcm9iYWJpbGl0eV9yYW5nZSA9IGN1dChtYXJnaW5hbF9wcm9iYWJpbGl0eSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMC4yNSwgMC41LCAwLjc1LCAxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjAtMC4yNSIsICIwLjI1LTAuNSIsICIwLjUtMC43NSIsICIwLjc1LTEiKSksCiAgICAgICAgIGpvaW50X3Byb2JhYmlsaXR5X3JhbmdlID0gY3V0KGpvaW50X3Byb2JhYmlsaXR5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAwLjI1LCAwLjUsIDAuNzUsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMC0wLjI1IiwgIjAuMjUtMC41IiwgIjAuNS0wLjc1IiwgIjAuNzUtMSIpKSwKICAgICAgICAgIyBwbmhfc3RhdGUgPSBjYXNlX3doZW4ocG5oX2NsYXNzaWZpY2F0aW9uID09ICJIZXRlcm9sb2dvdXMiIH4gIlJlaW5mZWN0aW9uIiwKICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgcG5oX2NsYXNzaWZpY2F0aW9uID09ICJIb21vbG9nb3VzIiB+ICJSZWxhcHNlIG9yIFJlY3J1ZGVzY2VuY2UiKQogICAgICAgICBwbmhfc3RhdGUgPSBjYXNlX3doZW4oaWJzX3JhbmdlID09ICIwLTAuMjUiIHwgaWJzX3JhbmdlID09ICIwLjI1LTAuNSIgfiAiUmVpbmZlY3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlic19yYW5nZSA9PSAiMC41LTAuNzUiIHwgaWJzX3JhbmdlID09ICIwLjc1LTEiKSB+ICJSZWxhcHNlIG9yIFJlY3J1ZGVzY2VuY2UiKQogICAgICAgICApICU+JSAKICBzZWxlY3Qoc3ViamVjdF9pZCwgZXBpc29kZV9udW1iZXIsIGRheXNfc2luY2VfZW5yb2xtZW50LCBpYnNfcmFuZ2UsIHBuaF9jbGFzc2lmaWNhdGlvbiwgcG5oX3N0YXRlLCBtYXJnaW5hbF9jbGFzc2lmaWNhdGlvbiwgbWFyZ2luYWxfcHJvYmFiaWxpdHksIG1hcmdpbmFsX3Byb2JhYmlsaXR5X3JhbmdlLCBqb2ludF9jbGFzc2lmaWNhdGlvbiwgam9pbnRfcHJvYmFiaWxpdHksIGpvaW50X3Byb2JhYmlsaXR5X3JhbmdlKSAlPiUgCiAgIyBub3cgb25seSBrZWVwIHRoZSBoaWdoZXN0ICdyYW5raW5nJyBtYXJnaW5hbCBjbGFzc2lmaWNhdGlvbgogIGdyb3VwX2J5KHN1YmplY3RfaWQsIGVwaXNvZGVfbnVtYmVyKSAlPiUgCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWFyZ2luYWxfcHJvYmFiaWxpdHksIG4gPSAxLCB3aXRoX3RpZXMgPSBGKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBncm91cF9ieShwbmhfc3RhdGUsIG1hcmdpbmFsX2NsYXNzaWZpY2F0aW9uLCBqb2ludF9jbGFzc2lmaWNhdGlvbikgJT4lCiAgdGFsbHkoKSAlPiUKICBkY2FzdChwbmhfc3RhdGUgfiBtYXJnaW5hbF9jbGFzc2lmaWNhdGlvbiArIGpvaW50X2NsYXNzaWZpY2F0aW9uLCB2YWx1ZS52YXIgPSAibiIsIGZpbGwgPSAwKQpgYGAKCmBgYHtyIHBsb3QgY29uZnVzaW9uIG1hdHJpeCBwbmggc3RhdGV9CmNvbmZ1c2lvbl9kYXRhX3BuaHN0YXRlICU+JSAKICBtZWx0KGlkLnZhcnMgPSAicG5oX3N0YXRlIikgJT4lIAogIGdncGxvdChhZXMocG5oX3N0YXRlLCB2YXJpYWJsZSwgZmlsbCA9IHZhbHVlKSkgKwogICAgZ2VvbV90aWxlKCkgKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gInJlZCIpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSB2YWx1ZSkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICBsYWJzKHggPSAiUE5IIGNsYXNzaWZpY2F0aW9uIiwKICAgICAgICAgeSA9ICJNYXJnaW5hbCB2cyBqb2ludCBjbGFzc2lmaWNhdGlvbiIsCiAgICAgICAgIGZpbGwgPSAiQ291bnQiKQpgYGAK